[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gnue/docs GDAQuickHackersGuide.pdf GDAQuickHack...
From: |
Derek Neighbors |
Subject: |
gnue/docs GDAQuickHackersGuide.pdf GDAQuickHack... |
Date: |
Sun, 01 Oct 2000 00:43:04 -0700 |
CVSROOT: /home/cvs
Module name: gnue
Changes by: Derek Neighbors <address@hidden> 00/10/01 00:43:03
Modified files:
docs : GDAQuickHackersGuide.pdf
GDAQuickHackersGuide.ps
GDAQuickHackersGuide.rtf GNUeObjectServer.pdf
GNUeObjectServer.ps GNUeObjectServer.rtf
Log message:
Do we really need the hard copies in CVS or only the source??? I dont
know but until we have a decision i will continue to put hard copies here.
CVSWeb URLs:
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/docs/GDAQuickHackersGuide.pdf.diff?r1=1.1&r2=1.2
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/docs/GDAQuickHackersGuide.ps.diff?r1=1.1&r2=1.2
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/docs/GDAQuickHackersGuide.rtf.diff?r1=1.1&r2=1.2
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/docs/GNUeObjectServer.pdf.diff?r1=1.1&r2=1.2
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/docs/GNUeObjectServer.ps.diff?r1=1.1&r2=1.2
http://subversions.gnu.org/cgi-bin/cvsweb/gnue/docs/GNUeObjectServer.rtf.diff?r1=1.1&r2=1.2
Patches:
Index: gnue/docs/GDAQuickHackersGuide.pdf
Index: gnue/docs/GDAQuickHackersGuide.ps
diff -u gnue/docs/GDAQuickHackersGuide.ps:1.1
gnue/docs/GDAQuickHackersGuide.ps:1.2
--- gnue/docs/GDAQuickHackersGuide.ps:1.1 Sat Aug 19 15:49:37 2000
+++ gnue/docs/GDAQuickHackersGuide.ps Sun Oct 1 00:43:03 2000
@@ -10,7 +10,7 @@
%DVIPSWebPage: (www.radicaleye.com)
%DVIPSCommandLine: dvips main.dvi -o main.ps
%DVIPSParameters: dpi=600, compressed
-%DVIPSSource: TeX output 2000.08.15:2236
+%DVIPSSource: TeX output 2000.10.01:0034
%%BeginProcSet: texc.pro
%!
/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
@@ -324,9 +324,9 @@
42 2[37 42 37 42 42 11[60 1[42 2[51 1[55 1[46 4[60 51
1[60 55 51 51 7[42 42 42 42 42 42 42 42 42 42 1[21 46[{
TeXBase1Encoding ReEncodeFont}41 83.022 /Times-Italic
-rf /Fc 134[42 42 1[42 46 28 32 37 1[46 42 46 69 23 1[28
-23 2[28 37 46 37 46 42 13[46 3[65 2[55 2[32 1[65 2[60
-60 1[60 7[42 1[42 42 42 42 42 42 42 42 1[21 46[{
+rf /Fc 134[42 42 1[42 46 28 32 37 1[46 42 46 1[23 1[28
+23 2[28 37 46 37 46 42 13[46 2[51 65 2[55 2[32 1[65 2[60
+60 1[60 8[42 42 42 42 42 42 42 42 42 1[21 46[{
TeXBase1Encoding ReEncodeFont}38 83.022 /Times-Bold rf
/Fd 134[96 96 1[96 105 57 96 67 1[105 105 105 153 48
1[48 48 105 1[57 96 105 96 105 96 11[124 105 115 2[115
@@ -337,22 +337,21 @@
10[48 48 41 37 2[37 1[48 1[41 2[22 1[48 37 1[48 44 44
48 5[18 8[33 33 33 18 17 22 17 2[22 22 5[27 34[{
TeXBase1Encoding ReEncodeFont}48 66.4176 /Times-Roman
-rf /Ff 3[42 82[63 18[42 27[37 42 42 60 42 42 23 32 28
-42 42 42 42 65 23 42 23 23 42 42 28 37 42 37 42 37 1[42
-5[60 1[78 1[60 51 46 55 1[46 60 60 74 51 2[28 60 60 46
-51 60 55 55 60 76 37 2[47 1[23 42 42 42 42 42 42 1[42
-42 42 23 21 28 21 47 42 28 28 28 4[34 28 30[46 2[{
-TeXBase1Encoding ReEncodeFont}75 83.022 /Times-Roman
-rf /Fg 138[51 28 46 32 1[51 1[51 2[46 1[23 3[46 51 46
-1[46 11[60 3[65 2[60 5[60 65 1[55 60 2[60 6[28 58[{
-TeXBase1Encoding ReEncodeFont}21 83.022 /Helvetica-Bold
-rf /Fh 134[55 2[55 1[33 55 39 1[61 61 61 89 28 2[28 3[55
-61 1[61 55 11[72 61 5[72 6[78 1[66 72 72 8[33 58[{
-TeXBase1Encoding ReEncodeFont}23 99.6264 /Helvetica-Bold
-rf /Fi 3[88 130[80 2[80 88 48 80 56 1[88 88 88 128 40
-80 40 40 88 88 1[80 88 80 88 80 1[80 7[135 3[96 104 2[112
-104 120 3[40 104 112 2[104 104 1[104 22[56 42[{
-TeXBase1Encoding ReEncodeFont}36 143.462 /Helvetica-Bold
+rf /Ff 3[42 82[63 46[37 42 42 60 42 42 23 32 28 42 42
+42 42 65 23 42 23 23 42 42 28 37 42 37 42 37 1[42 5[60
+1[78 1[60 51 46 55 1[46 60 60 74 51 60 1[28 60 60 46
+51 60 55 55 60 76 37 3[23 23 42 42 42 2[42 42 42 42 42
+23 21 28 21 47 42 28 28 28 4[34 31[46 2[{TeXBase1Encoding ReEncodeFont}
+73 83.022 /Times-Roman rf /Fg 138[51 28 46 32 1[51 1[51
+2[46 1[23 3[46 51 46 1[46 11[60 3[65 2[60 5[60 65 1[55
+60 2[60 6[28 58[{TeXBase1Encoding ReEncodeFont}21 83.022
+/Helvetica-Bold rf /Fh 134[55 2[55 1[33 55 39 1[61 61
+61 89 28 2[28 3[55 61 1[61 55 11[72 61 5[72 6[78 1[66
+72 72 8[33 58[{TeXBase1Encoding ReEncodeFont}23 99.6264
+/Helvetica-Bold rf /Fi 3[88 130[80 2[80 88 48 80 56 1[88
+88 88 128 40 80 40 40 88 88 1[80 88 80 88 80 1[80 7[135
+3[96 104 2[112 104 120 3[40 104 112 2[104 104 1[104 22[56
+42[{TeXBase1Encoding ReEncodeFont}36 143.462 /Helvetica-Bold
rf /Fj 138[126 69 115 80 1[126 1[126 2[115 1[57 3[115
126 115 1[115 11[149 3[161 2[149 5[149 161 1[138 149
2[149 6[69 58[{TeXBase1Encoding ReEncodeFont}21 206.584
@@ -375,7 +374,7 @@
2 1 bop Black Black 197 380 a Fg(GNU)23 b(Enterprise)g(:)g(GD)m(A)f
(Quic)n(k)h(Hac)n(ker)o(s)i(Guide)197 471 y Ff(by)20
b(Reinhard)f(M\374ller)197 654 y(by)197 836 y(Edited)h(by)f(Derek)h
-(Neighbors)197 1110 y(Published)f(T)l(ue)h(Aug)g(15)g(21:14:40)e(MST)i
+(Neighbors)197 1110 y(Published)f(Sam)i(Sep)f(30)g(01:13:00)e(CEST)i
(2000)197 1202 y(Cop)o(yright)f(\251)i(2000)d(by)i(Free)g(Softw)o(are)g
(F)o(oundation)197 1376 y Fe(Cop)o(yright)f(\(c\))f(2000)f(Free)h
(Softw)o(are)g(F)o(oundation)197 1467 y(Permission)g(is)f(granted)i(to)
@@ -607,17 +606,21 @@
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
--1 w(6)596 1227 y(4.)g(GD)m(A)g(Ser)o(v)o(er)g(Library)p
-Black 5 w(.)p Black Black -1 w(.)p Black Black(.)p Black
+-1 w(6)596 1227 y(4.)g(GD)m(A)g(Client)g(Library)p Black
+1 w(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p
+Black Black(.)p Black Black(.)p Black Black -1 w(.)p
+Black Black(.)p Black Black(.)p Black Black(.)p Black
+Black -1 w(.)p Black Black(.)p Black Black(.)p Black
+Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
-Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
+Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
@@ -629,30 +632,28 @@
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
-Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
+Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
+Black Black(.)p Black -1 w(7)795 1339 y Ff(gda_*)e(Objects)p
+Black 4 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
+Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
-Black(.)p Black -1 w(7)795 1339 y Ff(GD)m(A_Serv)o(er)e(Helper)i
-(Objects)p Black 4 w(.)p Black Black -1 w(.)p Black Black(.)p
-Black Black(.)p Black Black(.)p Black Black -1 w(.)p
-Black Black(.)p Black Black(.)p Black Black(.)p Black
-Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
+Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
-Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
@@ -663,25 +664,22 @@
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
+Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
-Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
-Black(.)p Black -1 w(7)795 1430 y(GD)m(A_Serv)o(er)e(Objects)p
-Black 2 w(.)p Black Black -1 w(.)p Black Black(.)p Black
+Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
-Black Black(.)p Black Black -1 w(.)p Black Black(.)p
-Black Black(.)p Black Black(.)p Black Black -1 w(.)p
-Black Black(.)p Black Black(.)p Black Black(.)p Black
-Black -1 w(.)p Black Black(.)p Black Black(.)p Black
+Black Black(.)p Black -1 w(7)795 1430 y(GD)m(A)i(Stub)g(Objects)p
+Black 3 w(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
@@ -691,11 +689,11 @@
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
-Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
+Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
@@ -706,20 +704,26 @@
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
--1 w(7)795 1521 y(GD)m(A_Serv)o(er_Impl)e(Objects)p Black
-11 w(.)p Black Black(.)p Black Black(.)p Black Black
+Black(.)p Black Black -1 w(.)p Black Black(.)p Black
+Black(.)p Black Black(.)p Black Black -1 w(.)p Black
+Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
+Black -1 w(.)p Black Black(.)p Black Black(.)p Black
+Black(.)p Black -1 w(7)596 1541 y Fc(5.)g(GD)m(A)g(Ser)o(v)o(er)g
+(Library)p Black 5 w(.)p Black Black -1 w(.)p Black Black(.)p
+Black Black(.)p Black Black(.)p Black Black -1 w(.)p
+Black Black(.)p Black Black(.)p Black Black(.)p Black
+Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
-Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
@@ -727,6 +731,7 @@
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
+Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
@@ -734,10 +739,7 @@
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
-Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
-Black Black(.)p Black Black(.)p Black -1 w(7)795 1612
-y(GD)m(A_Serv)o(er_Impl)p Black 11 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
@@ -746,9 +748,8 @@
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
-Black Black(.)p Black Black -1 w(.)p Black Black(.)p
-Black Black(.)p Black Black(.)p Black Black(.)p Black
-Black -1 w(.)p Black Black(.)p Black Black(.)p Black
+Black Black(.)p Black -1 w(8)795 1652 y Ff(impl_GD)m(A)f(Objects)p
+Black 3 w(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
@@ -758,10 +759,10 @@
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
-Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
+Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
@@ -771,27 +772,33 @@
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
-Black Black(.)p Black -1 w(8)596 1724 y Fc(5.)k(GD)m(A)g(Ser)o(v)o(er)g
-(Implementations)p Black 19 w(.)p Black Black -1 w(.)p
+Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
-Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p
+Black(.)p Black Black(.)p Black Black(.)p Black Black
+-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
+-1 w(8)795 1744 y(gda_serv)o(er)e(Objects)p Black 10
+w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
+Black Black -1 w(.)p Black Black(.)p Black Black(.)p
+Black Black(.)p Black Black -1 w(.)p Black Black(.)p
+Black Black(.)p Black Black(.)p Black Black -1 w(.)p
+Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
-Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
+Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
@@ -801,8 +808,7 @@
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
-Black(.)p Black Black(.)p Black -1 w(9)596 1835 y(6.)g(GD)m(A)g(Client)
-g(Library)p Black 1 w(.)p Black Black(.)p Black Black
+Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
@@ -811,13 +817,14 @@
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
-Black(.)p Black Black(.)p Black Black(.)p Black Black
--1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
+Black(.)p Black Black(.)p Black Black(.)p Black -1 w(8)795
+1835 y(gda_serv)o(er)g(Helper)j(Objects)p Black 13 w(.)p
+Black Black -1 w(.)p Black Black(.)p Black Black(.)p
+Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
-Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
@@ -827,28 +834,23 @@
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
+Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
-Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
-Black(.)p Black(10)795 1946 y Ff(GD)m(A_*)f(Objects)p
-Black 10 w(.)p Black Black -1 w(.)p Black Black(.)p Black
-Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
-Black -1 w(.)p Black Black(.)p Black Black(.)p Black
-Black(.)p Black Black -1 w(.)p Black Black(.)p Black
-Black(.)p Black Black(.)p Black Black -1 w(.)p Black
-Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p
+-1 w(8)795 1926 y(gda_serv)o(er_impl)p Black 8 w(.)p
+Black Black -5 w(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
@@ -859,10 +861,10 @@
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
-Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
+Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
@@ -871,8 +873,9 @@
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
-Black(.)p Black Black -1 w(.)p Black Black(.)p Black(10)795
-2038 y(GD)m(A)h(Sub)g(Objects)p Black 5 w(.)p Black Black(.)p
+Black(.)p Black Black -1 w(.)p Black Black(.)p Black
+Black(.)p Black Black(.)p Black Black -1 w(.)p Black
+Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
@@ -882,12 +885,20 @@
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
+Black -1 w(9)596 2038 y Fc(6.)g(GD)m(A)g(Pr)o(o)o(viders)p
+Black 10 w(.)p Black Black -1 w(.)p Black Black -1 w(.)p
+Black Black(.)p Black Black(.)p Black Black(.)p Black
+Black -1 w(.)p Black Black(.)p Black Black(.)p Black
+Black(.)p Black Black -1 w(.)p Black Black(.)p Black
+Black(.)p Black Black(.)p Black Black -1 w(.)p Black
+Black(.)p Black Black(.)p Black Black(.)p Black Black
+-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
+Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
-Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
@@ -897,16 +908,21 @@
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
-Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p
+Black(.)p Black Black(.)p Black Black(.)p Black Black
+-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
-Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
--1 w(.)p Black Black(.)p Black(10)596 2149 y Fc(I.)g(A)n(ppendixes)p
+-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
+Black Black -1 w(.)p Black Black(.)p Black Black(.)p
+Black Black(.)p Black Black -1 w(.)p Black Black(.)p
+Black Black(.)p Black Black(.)p Black Black -1 w(.)p
+Black Black(.)p Black Black(.)p Black Black(.)p Black
+Black -1 w(.)p Black Black(.)p Black(10)596 2149 y(I.)g(A)n(ppendixes)p
Black 7 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
@@ -1001,67 +1017,75 @@
3642 5876 a Fb(3)p Black eop
%%Page: 4 4
4 3 bop Black Black 197 422 a Fd(Chapter)48 b(1.)g(Intr)m(oduction)197
-828 y Fi(Wh)m(y)40 b(It)f(Came)g(About)596 991 y Ff(Some)23
-b(days)h(ago,)f(I)h(ha)n(v)o(e)g(spent)g(se)n(v)o(eral)f(hours)g
-(digging)g(through)e(the)j(code)g(of)g(GD)m(A)g(before)e(I)i(could)596
-1082 y(understand)18 b(the)j(structure)e(of)i(GD)m(A)g(deeper)e(than)h
-(that)h(it)g(consists)h(of)e(a)h(serv)o(er)f(part)g(and)g(a)h(client)g
-(part.)596 1173 y(W)m(ith)g(this)g(e)o(xperience)d(in)j(mind,)f(it)i(w)
-o(as)f(no)f(surprise)h(for)f(me)g(to)h(hear)f(from)g(others,)g(that)h
-(the)o(y)f(\002nd)g(the)596 1265 y(code)f(hard)g(to)i(understand.)596
-1397 y(In)h(my)h(personal)f(opinion,)g(the)h(code)f(is)j(v)o(ery)d
-(clear)m(,)g(when)h(you)f(only)h(ha)n(v)o(e)f(recognized)f(the)i
-(structure)596 1489 y(ho)n(w)c(the)h(dif)n(ferent)f(functions,)f
-(objects)i(and)g(libraries)g(w)o(ork)f(together)-5 b(.)596
-1622 y(As)25 b(I)g(think,)f(that)h(GD)m(A)g(is)h(a)f(good)e(set)j(of)e
-(libraries,)h(that)g(more)f(people)f(should)h(w)o(ork)g(on)h(it)g(and)f
-(that)596 1713 y(e)n(v)o(en)19 b(more)g(people)g(should)g(use)i(it,)f
-(I)h(decided)e(to)h(write)g(this)h("quick)e(hack)o(er')-5
+828 y Fi(Wh)m(y)40 b(It)f(Came)g(About)596 991 y Ff(When)30
+b(I)g(had)g(my)g(\002rst)h(look)e(at)i(gda,)e(I)i(spent)f(se)n(v)o
+(eral)g(hours)f(digging)f(through)h(the)h(code)f(of)h(GD)m(A)596
+1082 y(before)24 b(I)j(could)e(understand)f(the)i(structure)f(of)h(GD)m
+(A)g(deeper)f(than)h(that)g(it)h(consists)g(of)f(a)h(serv)o(er)e(part)
+596 1173 y(and)20 b(a)i(client)f(part.)f(W)m(ith)h(this)h(e)o
+(xperience)d(in)i(mind,)f(it)i(w)o(as)g(no)f(surprise)f(for)g(me)i(to)f
+(hear)f(from)g(others,)596 1265 y(that)g(the)o(y)f(\002nd)h(the)g(code)
+g(hard)f(to)i(understand.)596 1397 y(In)h(my)h(personal)f(opinion,)g
+(the)h(code)f(is)j(v)o(ery)d(clear)m(,)g(when)h(you)f(only)h(ha)n(v)o
+(e)f(recognized)f(the)i(structure)596 1489 y(ho)n(w)c(the)h(dif)n
+(ferent)f(functions,)f(objects)i(and)g(libraries)g(w)o(ork)f(together)
+-5 b(.)596 1622 y(As)25 b(I)g(think,)f(that)h(GD)m(A)g(is)h(a)f(good)e
+(set)j(of)e(libraries,)h(that)g(more)f(people)f(should)h(w)o(ork)g(on)h
+(it)g(and)f(that)596 1713 y(e)n(v)o(en)19 b(more)g(people)g(should)g
+(use)i(it,)f(I)h(decided)e(to)h(write)g(this)h("quick)e(hack)o(er')-5
b(s)20 b(guide".)197 2103 y Fi(Intended)38 b(A)l(udience)596
-2266 y Ff(This)29 b(document)e(adresses)i(people)f(that)h(w)o(ant)h(to)
-f(understand)e(ho)n(w)h(the)h(code)g(of)g(gda)f(w)o(orks.)h(After)596
-2357 y(reading)23 b(this)j(document,)d(you)i(will)h(not)f(understand)e
+2266 y Ff(This)25 b(document)e(adresses)i(people)f(that)h(w)o(ant)g(to)
+h(understand)c(ho)n(w)j(the)g(code)f(of)h(GD)m(A)g(w)o(orks.)g(After)
+596 2357 y(reading)e(this)j(document,)d(you)i(will)h(not)f(understand)e
(it,)j(b)n(ut)g(there)f(will)h(be)f(chances)g(that)g(you)g(\002nd)g(it)
596 2448 y(much)19 b(easier)h(to)g(hack)g(through)e(the)i(code)g(than)f
-(before.)596 2581 y(Y)-9 b(ou)18 b(should)g(read)h(this)g(document)f
-(after)g(ha)n(ving)g(understood)f(the)i(basic)g(concepts)g(and)f(goals)
-h(of)g(gda)g(\(I)596 2673 y(intend)14 b(you)g(just)i(read)f(the)h
+(before.)596 2581 y(Y)-9 b(ou)14 b(should)h(read)f(this)i(document)e
+(after)h(ha)n(ving)f(understood)f(the)i(basic)h(concepts)e(and)h(goals)
+g(of)g(GD)m(A)h(\(I)596 2673 y(intend)e(you)g(just)i(read)f(the)h
(introduction)c(on)j(http://www)-5 b(.gnome.or)o(g/gno)o(me-d)o(b\))9
-b(and)15 b(ha)n(ving)f(realized)596 2764 y(that)20 b(gda)f(is)j(the)e
-(non-visual)e(part)i(of)g(gnome-db)d(which)j(can)g(be)g(used)g(by)g(an)
-o(y)f(application.)596 2897 y(A)h(point)f(specially)g(re)o(garded)e(in)
-j(this)g(document)e(is)i(dependenc)o(y)d(on)i(gtk/gnome,)e(as)k(that)f
-(dependenc)o(y)596 2988 y(can)g(lead)g(to)g(problems)f(when)g(using)h
-(gda)g(with)g(non-gnome)d(applications.)596 3121 y(This)j(document)e
-(is)j(\(read:)f(should)f(be\))h(consistent)f(with)i(gnome-db)m(.0.0.96)
-o(.)197 3511 y Fi(Sug)o(g)q(estions)596 3674 y Ff(If)26
-b(you)g(think)g(this)h(document)e(is)i(good,)e(please)i(feel)f(free)h
-(to)f(read)h(it)g(as)g(often)f(as)i(you)d(lik)o(e)i(and)f(gi)n(v)o(e)
-596 3765 y(copies)19 b(of)h(it)h(to)g(as)f(man)o(y)f(people)h(you)f
-(lik)o(e.)596 3898 y(Editors)e(Note:)i(Y)-9 b(ou)18 b(ha)n(v)o(e)g(to)g
-(lo)o(v)o(e)g(Reinhards)g(attitude)g(to)n(w)o(ards)g(free)g(softw)o
-(are.)f(:\))i(It)g(e)n(v)o(en)e(carries)i(into)596 3989
-y(his)h(documentation!)596 4122 y(If)k(you)f(think)h(this)h(document)e
-(could)g(be)h(impro)o(v)o(ed,)e(please)i(feel)h(free)f(to)g(let)i(me)e
-(kno)n(w)f(what)i(I)f(could)596 4214 y(impro)o(v)o(e)18
+b(and)15 b(ha)n(ving)f(realized)596 2764 y(that)j(GD)m(A)h(is)h(the)f
+(non-visual)e(part)h(of)h(gnome-db)d(which)i(can)h(be)g(used)f(by)h(an)
+o(y)f(application.)f(\(Actually)-5 b(,)596 2855 y(GD)m(A)19
+b(has)h(been)f(seperated)g(from)g(the)g(rest)h(of)g(gnome-db)d(in)j
+(release)f(0.1.0,)f(b)n(ut)i(is)h(still)g(maintained)d(by)596
+2947 y(the)i(gnome-db)d(project)i(team\))596 3079 y(A)33
+b(point)f(specially)g(re)o(garded)e(in)j(this)g(document)e(is)j
+(dependenc)o(y)29 b(on)k(gtk/gnome,)d(as)j(that)g(depen-)596
+3171 y(denc)o(y)27 b(can)i(lead)g(to)g(problems)e(when)i(using)f(gda)h
+(with)g(non-gnome)d(applications.)h(Ho)n(we)n(v)o(er)m(,)g(there)596
+3262 y(are)22 b(chances)g(that)h(these)g(dependencies)e(will)j(be)e
+(remo)o(v)o(ed)f(before)g(the)i(release)g(of)g(0.1.1.)e(As)i(the)o(y)g
+(are)596 3353 y(a)d(v)o(ery)f(f)o(ast)i(mo)o(ving)e(tar)o(get)g
+(already)-5 b(,)19 b(the)h(information)e(here)i(is)h(maybe)e(not)h(up)g
+(to)h(date;)f(I)g(will)h(remo)o(v)o(e)596 3445 y(all)f(these)h
+(dependenc)o(y)c(discussions)j(in)g(one)g(of)g(the)g(ne)o(xt)f(v)o
+(ersions)g(of)h(the)h(document.)596 3578 y(Please)j(note)f(that)g(this)
+h(document)e(represents)g(my)h(personal)f(vie)n(w)i(of)f(things,)g(and)
+g(contains)f(f)o(acts)i(\(or)596 3669 y(what)d(I)h(think)f(is)i(a)f(f)o
+(act\))g(as)g(well)g(as)h(some)f(subjecti)n(v)o(e)e(opinions.)g(Of)i
+(course)f(I)h(will)h(change)d(the)i(docu-)596 3760 y(ment)g(if)h(a)g(f)
+o(act)f(ceases)h(to)g(be)g(correct)e(or)h(w)o(as)i(incorrect)d(from)h
+(the)g(be)o(ginning,)e(b)n(ut)i(I)h(also)g(will)g(gladly)596
+3852 y(change)18 b(the)j(subjecti)n(v)o(e)e(parts)h(of)g(the)g(te)o(xt)
+g(if)g(somebody)f(manages)g(to)h(change)f(my)h(opinion)e(;-\).)596
+3984 y(This)i(document)e(is)j(\(read:)f(should)f(be\))h(consistent)f
+(with)i(libgda-0.1.0.)197 4374 y Fi(Sug)o(g)q(estions)596
+4537 y Ff(If)26 b(you)g(think)g(this)h(document)e(is)i(good,)e(please)i
+(feel)f(free)h(to)f(read)h(it)g(as)g(often)f(as)i(you)d(lik)o(e)i(and)f
+(gi)n(v)o(e)596 4629 y(copies)19 b(of)h(it)h(to)g(as)f(man)o(y)f
+(people)h(you)f(lik)o(e.)596 4762 y(If)24 b(you)f(think)h(this)h
+(document)e(could)g(be)h(impro)o(v)o(ed,)e(please)i(feel)h(free)f(to)g
+(let)i(me)e(kno)n(w)f(what)i(I)f(could)596 4853 y(impro)o(v)o(e)18
b(or)i(-)h(e)n(v)o(en)e(better)h(-)h(impro)o(v)o(e)d(it)k(yourself.)c
(Please)k(let)f(me)f(kno)n(w)g(if)g(you)g(ha)n(v)o(e)g(made)g(changes,)
-596 4305 y(so)g(I)g(can)g(mer)o(ge)f(them.)596 4438 y(If)k(you)g(think)
+596 4944 y(so)g(I)g(can)g(mer)o(ge)f(them.)596 5077 y(If)k(you)g(think)
g(my)g(english)g(is)i(bad,)e(please)h(feel)f(free)h(to)g(correct)e(my)i
-(mistak)o(es)g(and)f(send)g(me)h(the)g(cor)n(-)596 4529
-y(rections)19 b(for)h(mer)o(ging.)596 4662 y(If)d(you)g(think)f(this)j
-(document)c(should)i(be)g(con)m(v)o(erted)e(to)j(docbook,)d(please)i
-(feel)h(free)f(to)h(do)f(that.)g(I)h(w)o(ould)596 4753
-y(agree)h(with)h(you)f(v)o(ery)f(strongly)h(:\))h(<\226)g(This)g(has)g
-(been)f(done!)f(An)o(yone)g(doing)h(docs)g(please)h(feel)g(free)f(to)
-596 4845 y(write)j(docs)f(and)h(we)g(will)h(con)m(v)o(ert.)d(Of)i
-(course)f(we)h(prefer)f(docbook)e(nati)n(v)o(ely)-5 b(,)20
-b(b)n(ut)i(we)h(will)g(tak)o(e)f(what)596 4936 y(we)e(can)g(get.)596
-5069 y(If)g(you)f(think)g(this)i(document)d(is)j(not)f(useful)g(at)h
-(all,)f(please)g(feel)h(free)e(to)i(ignore)e(it)h(:\))596
-5202 y(Reinhard)f(M\374ller)g(address@hidden)c
-(address@hidden)o(g)p Black 3642 5876 a Fb(4)p Black
-eop
+(mistak)o(es)g(and)f(send)g(me)h(the)g(cor)n(-)596 5168
+y(rections)19 b(for)h(mer)o(ging.)596 5301 y(If)g(you)f(think)g(this)i
+(document)d(is)j(not)f(useful)g(at)h(all,)f(please)g(feel)h(free)e(to)i
+(ignore)e(it)h(:\))596 5434 y(Reinhard)f(M\374ller)g
+(\(address@hidden)o(g\))p Black 3642 5876 a Fb(4)p
+Black eop
%%Page: 5 5
5 4 bop Black Black 197 422 a Fd(Chapter)48 b(2.)g(About)h(Objects)596
654 y Ff(In)20 b(the)h(follo)n(wing,)e(the)i(term)g("objects")f(means)h
@@ -1079,160 +1103,195 @@
h(of)g(GD)-7 b(A)596 654 y Ff(GD)m(A)20 b(is)h(made)e(up)h(of)g(se)n(v)
o(eral)g(pieces)g(as)h(laid)f(out)g(belo)n(w)-5 b(.)596
819 y Fa(Application)596 901 y(|)596 984 y(|\(calls)43
-b(directly\))596 1066 y(|)596 1148 y(gda-*)h(objects)850
-b(\\)596 1230 y(|)89 b(\\)596 1312 y(|\(calls)43 b(directly\))761
-b(>)44 b(libgda-client)88 b(\(directory)43 b(gda-clnt\))596
-1395 y(|)89 b(/)596 1477 y(gda-stubs)43 b(objects)671
+b(directly\))596 1066 y(|)596 1148 y(gda-*)h(objects)626
+b(\\)596 1230 y(|)1210 b(\\)596 1312 y(|\(calls)43 b(directly\))537
+b(>)44 b(libgda-client)88 b(\(directory)43 b(lib/gda-clnt\))596
+1395 y(|)1210 b(/)596 1477 y(gda-stubs)43 b(objects)447
b(/)596 1559 y(|)596 1641 y(|\(calls)43 b(via)h(ORBIT\))596
-1723 y(|)596 1806 y(gda-server-impl)e(objects)402 b(\\)596
-1888 y(|)89 b(\\)596 1970 y(|\(calls\))1164 b(>)44 b(libgda-server)88
-b(\(directory)43 b(gda-srv\))596 2052 y(|)89 b(/)596
-2134 y(gda-server)43 b(objects)626 b(/)596 2216 y(|)596
-2299 y(|\(calls)43 b(via)h(callback)g(functions\))596
-2381 y(|)596 2463 y(gda-???)f(implementations)580 b(libgda-???)88
-b(\(directories)43 b(gda-*-server\))596 2545 y(|)596
-2627 y(|\(calls)g(directly\))596 2710 y(|)596 2792 y(Database)g
-(Backend)p Black 3641 5876 a Fb(6)p Black eop
+1723 y(|)596 1806 y(gda-server-impl)e(objects)178 b(\\)596
+1888 y(|)224 b(\\)596 1970 y(|\(calls)43 b(directly\))537
+b(>)44 b(libgda-server)88 b(\(directory)43 b(lib/gda-srv\))596
+2052 y(|)224 b(/)596 2134 y(gda-server)43 b(objects)402
+b(/)596 2216 y(|)596 2299 y(|\(calls)43 b(via)h(callback)g(functions\))
+596 2381 y(|)596 2463 y(gda-???)f(implementations)356
+b(provider)89 b(\(directories)42 b(providers/gda-*-)596
+2545 y(server\))596 2627 y(|)596 2710 y(|\(calls)h(directly\))596
+2792 y(|)596 2874 y(Database)g(Backend)596 3048 y Ff(Between)26
+b(the)h(client)g(and)g(the)g(serv)o(er)m(,)e(there)h(is)i(the)f(GD)m(A)
+g(CORB)m(A)i(interf)o(ace,)c(de\002ned)h(by)h(the)g(IDL)596
+3140 y(\002les)h(in)f(the)g(idl)h(directory)-5 b(.)25
+b(Note)i(that)g(these)g(IDL)g(\002les)i(contain)d(a)h(lot)h(of)f
+(methods)f(that)h(are)g(neither)596 3231 y(used)20 b(nor)h
+(implemented,)d(and)j(some)g(of)g(them)f(probably)f(ne)n(v)o(er)h
+(will,)h(at)h(least)g(not)e(e)o(xactly)g(as)i(the)o(y)f(are)596
+3322 y(written)f(do)n(wn)g(no)n(w)-5 b(.)20 b(So)h(please)g(don')o(t)e
+(rely)h(on)h(all)g(the)g(methods)f(being)g(there)g(if)h(you)f(use)h
+(the)g(IDL)g(\002le)596 3414 y(directly;)g(use)h(only)f(the)h(methods)f
+(that)h(are)g(already)e(implemented)g(serv)o(er)n(-sided)h(and)g
+(wrapped)f(in)i(the)596 3505 y(client)e(library)-5 b(.)18
+b(Maybe)h(someday)g(the)i(IDL)f(\002les)h(will)g(be)f(cleaned)f(up.)p
+Black 3641 5876 a Fb(6)p Black eop
%%Page: 7 7
7 6 bop Black Black 197 422 a Fd(Chapter)48 b(4.)g(GD)-7
-b(A)48 b(Ser)r(ver)f(Librar)r(y)197 828 y Fi(GD)-6 b(A_Ser)q(ver)38
-b(Helper)g(Objects)596 991 y Ff(The)16 b(follo)n(wing)f(objects)i(are)f
-(absolute)g(lo)n(w-le)n(v)o(el)g(helper)g(objects)g(designed)g(to)h
-(ease)g(the)g(de)n(v)o(elopement)596 1082 y(of)i(gda)h(serv)o(er)f
-(implementations:)596 1247 y Fa(function)43 b(prefix)358
-b(data)44 b(structure)357 b(source)44 b(file)596 1329
-y(gda_server_error)311 b(Gda_ServerError)266 b(gda-server-error.c)596
-1411 y(gda_server_field)311 b(Gda_ServerField)266 b(gda-server-field.c)
-596 1668 y Ff(This)20 b(code)f(is)j(dependent)17 b(from)j(nothing)e(b)n
-(ut)i(glib)g(and)g(some)g(typedefs)f(from)g(gda.h)197
-2058 y Fi(GD)-6 b(A_Ser)q(ver)38 b(Objects)596 2221 y
-Ff(The)19 b(follo)n(wing)g(objects)h(b)n(uild)g(the)g(base)g(of)g(the)g
-(gda)g(pro)o(viders:)596 2386 y Fa(function)43 b(prefix)358
-b(data)44 b(structure)357 b(source)44 b(file)596 2468
-y(gda_server_command)221 b(Gda_ServerCommand)g(gda-server-command.c)596
-2551 y(gda_server_connection)86 b(Gda_ServerConnection)g
-(gda-server-connection.c)596 2633 y(gda_server_recordset)131
-b(Gda_ServerRecordset)g(gda-server-recordset.c)596 2889
+b(A)48 b(Client)g(Librar)r(y)197 828 y Fi(gda_*)39 b(Objects)596
+991 y Ff(The)24 b(follo)n(wing)f(objects)i(are)g(v)o(ery)e(much)h(real)
+h(objects)g(in)g(the)g(sense)g(that)g(the)o(y)f(are)h(currently)e
+(imple-)596 1082 y(mented)j(as)i(real)g(GtkObjects,)f(wich)g(will)i
+(soon)e(be)g(changed)f(into)h(GObject)g(to)h(mak)o(e)f(them)g(all)h
+(Gtk)596 1173 y(independent.)596 1338 y Fa(function)43
+b(prefix)268 b(data)44 b(structure)268 b(source)43 b(file)596
+1421 y(gda_batch)536 b(Gda_Batch)492 b(gda-batch.c)596
+1503 y(gda_command)267 b(Gda_Command)87 b(gda-command.c)596
+1585 y(gda_connection)266 b(Gda_Connection)87 b(gda-connection.c)596
+1667 y(gda_connection_pool)f(Gda_ConnectionPool)h
+(gda-connection-pool.c)596 1749 y(gda_error)267 b(Gda_Error)88
+b(gda-error.c)596 1832 y(gda_field)267 b(Gda_Field)88
+b(gda-field.c)596 1914 y(gda_recordset)266 b(Gda_Recordset)88
+b(gda-recordset.c)596 2170 y Ff(These)25 b(objects)g(are)h(the)f(ones)g
+(directly)g(used)h(by)f(GD)m(A)g(client)h(programs.)d(The)o(y)i(are)g
+(e)o(xtensi)n(v)o(ely)f(de-)596 2262 y(scribed)19 b(in)h(the)h(a)n(v)n
+(ailable)e(documentation.)596 2394 y(Although)c(these)i(objects)f(ha)n
+(v)o(e)h(v)o(ery)f(much)g(b)n(uilt-in)g(functionality)f(the)o(y)h(pro)o
+(vide)f(by)h(themselv)o(es,)g(the)o(y)596 2486 y(can)30
+b(simplistically)h(be)g(re)o(garded)d(as)k(wrappers)d(around)g(the)i
+(CORB)m(A)h(objects)f(de\002ned)f(in)h(gda.idl.)596 2577
+y(Therefore,)18 b(man)o(y)h(of)h(the)h(object)f(functions)f(simply)i
+(call)g(the)f(appropriate)e(underlying)g(CORB)m(A)23
+b(Stub)596 2668 y(function.)197 3058 y Fi(GD)-6 b(A)39
+b(Stub)g(Objects)596 3221 y Ff(The)17 b(code)h(for)f(the)h(stub)g
+(implementation)e(is)j(generated)d(by)i(orbit-idl)e(automagically)-5
+b(.)16 b(An)o(yw)o(ay)-5 b(,)16 b(as)j(it)g(is)596 3313
+y(its)i(o)n(wn)e(layer)m(,)h(and)f(the)h(functions)f(are)h(called)g(by)
+g(the)g(abo)o(v)o(e)f(gda_*)f(objects,)i(the)o(y)g(are)g(listed)g(belo)
+n(w:)596 3478 y Fa(function)43 b(prefix)313 b(data)44
+b(structure)357 b(source)44 b(file)596 3560 y(GDA_Fieldx)536
+b(GDA_Fieldx)g(gda-stubs.c)596 3642 y(GDA_Parameter)401
+b(GDA_Parameter)g(gda-stubs.c)596 3725 y(GDA_Command)491
+b(GDA_Command)g(gda-stubs.c)596 3807 y(GDA_Connection)356
+b(GDA_Connection)222 b(gda-stubs.c)596 3889 y(GDA_Recordset)401
+b(GDA_Recordset)222 b(gda-stubs.c)596 3971 y(GDA_ConnectionFactory)41
+b(GDA_ConnectionFactory)g(gda-stubs.c)596 4228 y Ff(The)22
+b(GD)m(A_Fieldx)f(stub)i(seems)g(to)g(be)f(neither)g(used)h(from)e(the)
+i(gda-client)e(library)h(nor)f(implemented)596 4319 y(by)j(the)i
+(gda-serv)o(er)d(library)-5 b(.)23 b(It')-5 b(s)26 b(either)f(a)h
+(remnant)e(of)h(the)h(past)f(or)g(a)h(start)g(of)f(a)h(feature)e(that)h
+(will)i(be)596 4410 y(created)19 b(in)h(the)h(future.)596
+4543 y(The)h(GD)m(A_P)o(arameter)e(stub)i(is)i(not)e(used)g(by)g(an)o
+(y)g(of)g(the)g(gda_*)f(objects.)h(This)h(is)g(probably)d(reserv)o(ed)
+596 4634 y(for)f(future)g(use.)596 4767 y(The)g(GD)m(A_ConnectionF)o
+(actory)d(is)21 b(used)f(by)g(gda_connection)d(to)j(create)g(a)h(ne)n
+(w)f(connection.)p Black 3639 5876 a Fb(7)p Black eop
+%%Page: 8 8
+8 7 bop Black Black 197 422 a Fd(Chapter)48 b(5.)g(GD)-7
+b(A)48 b(Ser)r(ver)f(Librar)r(y)197 828 y Fi(impl_GD)-6
+b(A)38 b(Objects)596 991 y Ff(No)n(w)19 b(we)g(mo)o(v)o(e)f(on)h(the)g
+(serv)o(er)f(side)h(of)g(the)g(CORB)m(A)i(connection.)c(These)i
+(objects)g(are)g(the)g(implemen-)596 1082 y(tation)g(of)h(the)h(GD)m(A)
+f(CORB)m(A)i(interf)o(ace.)596 1247 y Fa(function)43
+b(prefix)537 b(data)44 b(structure)88 b(source)44 b(file)596
+1329 y(impl_GDA_Parameter)400 b(impl_POA_GDA_*)87 b
+(gda-server-impl-command.c)596 1411 y(impl_GDA_Command)490
+b(impl_POA_GDA_*)87 b(gda-server-impl-command.c)596 1494
+y(impl_GDA_Connection)355 b(impl_POA_GDA_*)87 b
+(gda-server-impl-connection.c)596 1576 y(impl_GDA_Recordset)400
+b(impl_POA_GDA_*)87 b(gda-server-impl-recordset.c)596
+1658 y(impl_GDA_ConnectionFactory)40 b(impl_POA_GDA_*)87
+b(gda-server-impl-factory.c)596 1915 y Ff(These)28 b(objects)g(are)h
+(neither)f(gnome)f(nor)h(gtk)g(dependent.)e(But)j(the)o(y)f(mak)o(e)g
+(up)h(complete)e(CORB)m(A-)596 2006 y(enabled)18 b(objects)i(matching)f
+(gda.idl.)596 2139 y(One)28 b(could)g(re)o(gard)f(these)i(objects)g(as)
+g("wrappers")f(around)f(the)h(gda-serv)o(er)f(objects)h(to)h(mak)o(e)g
+(them)596 2230 y(match)14 b(CORB)m(A)j(speci\002cations;)e(only)f(the)i
+(ConnectionF)o(actory)11 b(object)k(has)h(no)e(underlying)f(gda_serv)o
+(er)n(-)596 2321 y(object.)596 2454 y(There)26 b(is)h(no)g(gda_serv)o
+(er_parameter)22 b(yet)27 b(as)g(none)f(of)g(the)h(methods)f(of)h
+(gda_serv)o(er_parameter)22 b(are)596 2546 y(yet)e(implemented)e(:\))
+596 2678 y(Note)g(that)g(there)f(is)i(a)g(source)e(\002le)i(called)f
+(gda-serv)o(er)n(-impl.c)c(which)k(is,)h(unlik)o(e)e(the)h(abo)o(v)o(e)
+e(source)i(\002les,)596 2770 y(not)h(the)i(implementation)d(of)h(a)i
+(CORB)m(A)h(interf)o(ace.)197 3160 y Fi(gda_ser)q(ver)38
+b(Objects)596 3323 y Ff(The)19 b(follo)n(wing)g(objects)h(b)n(uild)g
+(the)g(base)g(of)g(the)g(gda)g(pro)o(viders:)596 3488
+y Fa(function)43 b(prefix)358 b(data)44 b(structure)357
+b(source)44 b(file)596 3570 y(gda_server_command)221
+b(Gda_ServerCommand)g(gda-server-command.c)596 3652 y
+(gda_server_connection)86 b(Gda_ServerConnection)g
+(gda-server-connection.c)596 3735 y(gda_server_recordset)131
+b(Gda_ServerRecordset)g(gda-server-recordset.c)596 3991
y Ff(The)21 b(code)g(of)h(these)g(objects)g(is)g(really)g(neither)f
(gnome)f(nor)h(gtk)h(dependent.)d(CORB)m(A)24 b(dependenc)o(y)19
-b(is)596 2981 y(only)g(because)g(the)o(y)h(use)g(some)g(types)g
-(de\002ned)f(in)i(the)f(idl.)596 3113 y(Unfortunately)-5
+b(is)596 4082 y(only)g(because)g(the)o(y)h(use)g(some)g(types)g
+(de\002ned)f(in)i(the)f(idl.)596 4215 y(Unfortunately)-5
b(,)16 b(the)j(header)f(\002le)j(gda-serv)o(er)n(-impl.h)15
b(is)21 b(v)o(ery)d(general)g(\(it')-5 b(s)21 b(used)e(by)g(all)h
-(sources)f(in)g(the)596 3205 y(gda-srv)d(directory\))g(and)i(thus)g
+(sources)f(in)g(the)596 4307 y(gda-srv)d(directory\))g(and)i(thus)g
(contains)g(much)f(stuf)n(f)h(that)g(w)o(ouldn')o(t)f(be)h(needed)f(by)
-h(these)g(\002les.)h(So)f(you)596 3296 y(can')o(t)h(e)n(v)o(en)g
+h(these)g(\002les.)h(So)f(you)596 4398 y(can')o(t)h(e)n(v)o(en)g
(compile)g(the)h(abo)o(v)o(e)f(sources)g(without)h(gnome)e(or)i(gtk)g
(although)e(the)i(code)g(itself)g(w)o(ouldn')o(t)596
-3387 y(need)f(it.)596 3520 y(These)d(objects)h(can)g(v)o(ery)f(much)f
+4489 y(need)f(it.)596 4622 y(These)d(objects)h(can)g(v)o(ery)f(much)f
(be)i(re)o(garded)e(as)i("abstract")g(objects.)f(Each)h(pro)o(vider)d
-(must)j("o)o(v)o(erload")596 3612 y(certain)i(functions.)f(This)h
+(must)j("o)o(v)o(erload")596 4713 y(certain)i(functions.)f(This)h
(happens)g(by)g(pro)o(viding)e(a)j(list)g(of)g(functions)e(when)h
-(starting)g(the)h(serv)o(er)e(code,)596 3703 y(from)h(where)g(the)h
+(starting)g(the)h(serv)o(er)e(code,)596 4805 y(from)h(where)g(the)h
(gda_serv)o(er_*)d(objects)j(tak)o(e)g(the)h(functions)d(to)j(really)e
-(call.)596 3836 y(Each)g(of)h(these)h(objects)f(pro)o(vide)e(a)i
+(call.)596 4937 y(Each)g(of)h(these)h(objects)f(pro)o(vide)e(a)i
(member)f("user_data")g(that)h(can)g(be)g(used)g(by)g(the)g(speci\002c)
-h(pro)o(vider)596 3927 y(code)e(to)h(store)h(back)o(end)d(speci\002c)i
-(data)h(structures.)197 4317 y Fi(GD)-6 b(A_Ser)q(ver_Impl)36
-b(Objects)596 4480 y Ff(Around)18 b(the)i(gda-serv)o(er)e(objects,)i
-(another)e(layer)i(is)h(b)n(uilt)g(to)f(match)g(the)g(complete)f(idl)h
-(of)g(gda.)596 4645 y Fa(function)43 b(prefix)268 b(data)44
-b(structure)492 b(source)44 b(file)596 4728 y(impl_GDA_Parameter)131
-b(impl_POA_GDA_Parameter)g(gda-server-impl-command.c)596
-4810 y(impl_GDA_Command)221 b(impl_POA_GDA_Command)g
-(gda-server-impl-command.c)596 4892 y(impl_GDA_Connection)86
-b(impl_POA_GDA_Connection)g(gda-server-impl-connection.c)596
-4974 y(impl_GDA_Recordset)131 b(impl_POA_GDA_Recordset)g
-(gda-server-impl-recordset.c)596 5231 y Ff(These)28 b(objects)g(are)h
-(neither)f(gnome)f(nor)h(gtk)g(dependent.)e(But)j(the)o(y)f(mak)o(e)g
-(up)h(complete)e(CORB)m(A-)596 5322 y(enabled)18 b(objects)i(matching)f
-(gda.idl.)p Black 3639 5945 a Fb(7)p Black eop
-%%Page: 8 8
-8 7 bop Black 197 -132 a Fb(Chapter)20 b(4.)g(GD)m(A)g(Server)h(Libr)o
-(ary)p Black 596 380 a Ff(One)28 b(could)g(re)o(gard)f(these)i(objects)
-g(as)g("wrappers")f(around)f(the)h(gda-serv)o(er)f(objects)h(to)h(mak)o
-(e)g(them)596 471 y(match)19 b(CORB)m(A)j(speci\002cations.)596
-604 y(There)k(is)h(no)g(gda_serv)o(er_parameter)22 b(yet)27
-b(as)g(none)f(of)g(the)h(methods)f(of)h(gda_serv)o(er_parameter)22
-b(are)596 695 y(yet)e(implemented)e(:\))197 1085 y Fi(GD)-6
-b(A_Ser)q(ver_Impl)596 1248 y Ff(Unfortunately)17 b(there)j(is)h(an)f
-(o)n(wn)f(object)h(called)g(gda-serv)o(er)n(-impl)d(which)i(has)i
-(nothing)d(to)i(do)g(with)g(the)596 1339 y(gda-serv)o(er)n(-impl-*)c
-(objects.)596 1505 y Fa(function)43 b(prefix)537 b(data)44
-b(structure)761 b(source)44 b(file)596 1587 y(gda_server_impl)176
-b(Gda_ServerImpl)760 b(gda-server-impl.c)596 1669 y
-(impl_GDA_ConnectionFactory)40 b(impl_POA_GDA_ConnectionFactory)596
-1751 y(gda-server-factory.c)596 2008 y Ff(gda_serv)o(er_impl)19
-b(is)24 b(a)g(gtk)f(object)g(that)g(represents)g(an)g(instance)g(of)g
-(a)g(running)f(serv)o(er)-5 b(.)22 b(It)i(is)g(used)f(for)596
-2099 y(tasks)d(lik)o(e)h(re)o(gistering)d(the)j(serv)o(er)e(into)h(the)
-g(system,)g(creating)f(the)i(f)o(actory)e(etc.)596 2232
-y(GD)m(A_ConnectionF)o(actory)26 b(is)31 b(a)f(CORB)m(A)i(object)e
-(that)g(is)i(able)e(to)g(create)g(ne)n(w)g(GD)m(A_Connection)596
-2323 y(CORB)m(A)21 b(objects.)f(It')-5 b(s)21 b(gnome)e(dependent.)596
-2456 y(These)g(tw)o(o)h(objects)g(are)g(really)f(gtk)h(and)f(gnome)f
-(dependent.)g(The)h(dependenc)o(y)e(results)j(from)f(the)g(w)o(ay)596
-2547 y(ho)n(w)k(CORB)m(A)j(serv)o(ers)e(are)h(re)o(gistered)e(into)h
-(the)g(system)h(so)f(that)h(clients)g(ha)n(v)o(e)e(a)i(con)m(v)o
-(enient)d(w)o(ay)i(to)596 2639 y(\002nd)19 b(the)i(serv)o(er)e(the)o(y)
-g(w)o(ant.)596 2772 y(Hopefully)f(these)i(dependencies)e(will)j(be)f
-(remo)o(v)o(ed)e(when)i(O)m(AF)h(is)g(used.)p Black 197
-5876 a Fb(8)p Black eop
+h(pro)o(vider)596 5029 y(code)e(to)h(store)h(back)o(end)d(speci\002c)i
+(data)h(structures.)p Black 3642 5876 a Fb(8)p Black
+eop
%%Page: 9 9
-9 8 bop Black Black 197 422 a Fd(Chapter)48 b(5.)g(GD)-7
-b(A)48 b(Ser)r(ver)f(Implementations)596 654 y Ff(The)31
-b(actual)g(serv)o(er)g(implementation)f(just)i(implements)f(the)g
-(missing)h(functions)e(mentioned)g(under)596 745 y("gda_serv)o(er)17
-b(object".)596 878 y(These)k(functions)f(are)h(implemented)f(in)i
-(gda-???-command.c,)16 b(gda-???-connection.c)h(and)k(gda-???-)596
-970 y(recordset.c.)33 b(The)h(main-???.c)g(source)g(contains)g(the)h
-(main\(\))f(routine)f(for)i(the)g(serv)o(er)f(e)o(x)o(ecutable,)596
-1061 y(which)28 b(does)g(nothing)f(b)n(ut)i(initialize)g(corba,)e
-(create)i(a)g(gda_serv)o(er_impl)c(object)j(and)g(pass)h(to)g(it)g(the)
-596 1152 y(list)18 b(of)g(function)e(implementations.)g(The)h(main\(\))
-g(function)f(thus)h(is)i(gnome-dependent,)13 b(the)18
-b(rest)g(of)f(the)596 1243 y(code)i(isn')o(t.)596 1376
-y(All)k(of)g(these)g(functions)e(use)i(the)g(\002eld)g(user_data)f
-(from)f(the)i(corresponding)d(gda_serv)o(er_*)f(object)j(to)596
-1468 y(store)e(nati)n(v)o(e)f(data)h(structures)g(of)g(the)g(database.)
-596 1600 y(Some)i(GD)m(A)g(serv)o(ers)g(also)h(implement)f(a)h
-(con\002guration)c(tool,)k(which)f(is)h(named)f(gda-???-con\002g)d(and)
-596 1692 y(has)i(absolutely)e(nothing)h(to)h(do)f(with)h(the)g
-(implementation)e(of)i(the)f(serv)o(er)m(,)g(as)i(it')-5
-b(s)22 b(a)f(totally)g(high-le)n(v)o(el)596 1783 y(application.)p
-Black 3642 5876 a Fb(9)p Black eop
+9 8 bop Black 2630 -132 a Fb(Chapter)20 b(5.)g(GD)m(A)g(Server)g(Libr)o
+(ary)p Black 197 401 a Fi(gda_ser)q(ver)38 b(Helper)g(Objects)596
+564 y Ff(The)16 b(follo)n(wing)f(objects)i(are)f(absolute)g(lo)n(w-le)n
+(v)o(el)g(helper)g(objects)g(designed)g(to)h(ease)g(the)g(de)n(v)o
+(elopement)596 656 y(of)i(gda)h(serv)o(er)f(implementations:)596
+821 y Fa(function)43 b(prefix)358 b(data)44 b(structure)357
+b(source)44 b(file)596 903 y(gda_server_error)311 b(Gda_ServerError)266
+b(gda-server-error.c)596 985 y(gda_server_field)311 b(Gda_ServerField)
+266 b(gda-server-field.c)596 1242 y Ff(This)20 b(code)f(is)j(dependent)
+17 b(from)j(nothing)e(b)n(ut)i(glib)g(and)g(some)g(typedefs)f(from)g
+(gda.h)197 1632 y Fi(gda_ser)q(ver_impl)596 1795 y Ff(Unfortunately)e
+(there)j(is)h(an)f(o)n(wn)f(object)h(called)g(gda-serv)o(er)n(-impl)d
+(which)i(has)i(nothing)d(to)i(do)g(with)g(the)596 1886
+y(gda-serv)o(er)n(-impl-*)c(objects.)596 2051 y Fa(function)43
+b(prefix)537 b(data)44 b(structure)761 b(source)44 b(file)596
+2134 y(gda_server_impl)176 b(Gda_ServerImpl)760 b(gda-server-impl.c)596
+2390 y Ff(gda_serv)o(er_impl)16 b(is)k(a)h(gtk)e(object)g(\(the)h(only)
+f(one)g(in)h(the)g(serv)o(er)f(library\))f(that)i(represents)f(an)h
+(instance)596 2481 y(of)f(a)i(running)d(serv)o(er)-5
+b(.)20 b(It)g(is)i(used)e(for)f(tasks)i(lik)o(e)g(re)o(gistering)d(the)
+i(serv)o(er)g(into)g(the)g(system,)g(creating)f(the)596
+2573 y(f)o(actory)h(etc.)h(It)h(is)g(mainly)e(used)i(by)e(the)i(pro)o
+(viders.)d(Also,)i(the)g(list)i(of)e(callback)f(functions)g(is)j
+(stored)d(in)596 2664 y(the)g(data)g(structure)f(of)h(Gda_Serv)o
+(erImpl.)596 2797 y(Note)d(that)h(the)g(functions)f(gda_serv)o
+(er_impl_e)o(xcep)o(tion,)12 b(gda_serv)o(er_impl_mak)o(e_er)o(ro)o(r_)
+o(b)n(uf)m(fer)g(and)596 2888 y(gda_serv)o(er_impl_\002nd)j(can)20
+b(not)g(be)g(re)o(garded)d(as)k(methods)f(of)g(the)g(gda_serv)o
+(er_impl)c(pseudo-object,)596 2980 y(b)n(ut)24 b(are)h(rather)e
+(unrelated)h(helper)f(functions)g(that)i(are)g(used)f(by)g(the)h
+(gda-serv)o(er)d(library)i(itself)h(and/or)596 3071 y(by)19
+b(the)i(pro)o(viders.)p Black 3642 5876 a Fb(9)p Black
+eop
%%Page: 10 10
10 9 bop Black Black 197 422 a Fd(Chapter)48 b(6.)g(GD)-7
-b(A)48 b(Client)g(Librar)r(y)197 828 y Fi(GD)-6 b(A_*)38
-b(Objects)596 991 y Ff(The)24 b(follo)n(wing)f(objects)i(are)g(v)o(ery)
-e(much)h(real)h(objects)g(in)g(the)g(sense)g(that)g(the)o(y)f(are)h
-(currently)e(imple-)596 1082 y(mented)j(as)i(real)g(GtkObjects,)f(wich)
-g(will)i(soon)e(be)g(changed)f(into)h(GObject)g(to)h(mak)o(e)f(them)g
-(all)h(Gtk)596 1173 y(independent.)596 1338 y Fa(function)43
-b(prefix)268 b(data)44 b(structure)268 b(source)43 b(file)596
-1421 y(gda_batch)536 b(Gda_Batch)492 b(gda-batch.c)596
-1503 y(gda_command)267 b(Gda_Command)87 b(gda-command.c)596
-1585 y(gda_connection)266 b(Gda_Connection)87 b(gda-connection.c)596
-1667 y(gda_connection_pool)f(Gda_ConnectionPool)h
-(gda-connection-pool.c)596 1749 y(gda_error)267 b(Gda_Error)88
-b(gda-error.c)596 1832 y(gda_field)267 b(Gda_Field)88
-b(gda-field.c)596 1914 y(gda_recordset)266 b(Gda_Recordset)88
-b(gda-recordset.c)197 2427 y Fi(GD)-6 b(A)39 b(Sub)g(Objects)596
-2590 y Ff(The)17 b(code)h(for)f(the)h(stub)g(implementation)e(is)j
-(generated)d(by)i(orbit-idl)e(automagically)-5 b(.)16
-b(An)o(yw)o(ay)-5 b(,)16 b(as)j(it)g(is)596 2682 y(its)i(o)n(wn)e
-(layer)m(,)h(and)f(the)h(functions)f(are)h(called)g(by)g(the)g(abo)o(v)
-o(e)f(gda_*)f(objects,)i(the)o(y)g(are)g(listed)g(belo)n(w:)596
-2847 y Fa(function)43 b(prefix)89 b(data)44 b(structure)88
-b(source)44 b(file)596 2929 y(GDA_Fieldx)312 b(GDA_Fieldx)267
-b(gda-stubs.c)596 3011 y(GDA_Parameter)177 b(GDA_Parameter)132
-b(gda-stubs.c)596 3094 y(GDA_Command)267 b(GDA_Command)87
-b(gda-stubs.c)596 3176 y(GDA_Connection)132 b(GDA_Connection)87
-b(gda-stubs.c)596 3258 y(GDA_Recordset)177 b(GDA_Recordset)87
-b(gda-stubs.c)596 3514 y Ff(The)22 b(GD)m(A_Fieldx)f(stub)i(seems)g(to)
-g(be)f(neither)g(used)h(from)e(the)i(gda-client)e(library)h(nor)f
-(implemented)596 3606 y(by)e(the)i(gda-serv)o(er)c(library)-5
-b(.)p Black 3601 5876 a Fb(10)p Black eop
+b(A)48 b(Pr)m(o)m(vider)m(s)596 654 y Ff(The)23 b(actual)h(pro)o(vider)
+d(implementation)h(just)i(implements)f(the)h(missing)g(functions)e
+(mentioned)g(under)596 745 y("gda_serv)o(er)17 b(objects".)596
+878 y(These)k(functions)f(are)h(implemented)f(in)i(gda-???-command.c,)
+16 b(gda-???-connection.c)h(and)k(gda-???-)596 970 y(recordset.c.)33
+b(The)h(main-???.c)g(source)g(contains)g(the)h(main\(\))f(routine)f
+(for)i(the)g(serv)o(er)f(e)o(x)o(ecutable,)596 1061 y(which)28
+b(does)g(nothing)f(b)n(ut)i(initialize)g(corba,)e(create)i(a)g
+(gda_serv)o(er_impl)c(object)j(and)g(pass)h(to)g(it)g(the)596
+1152 y(list)23 b(of)e(function)g(implementations.)f(The)h(main\(\))g
+(function)f(thus)i(is)h(GTK-dependent,)c(the)j(rest)h(of)e(the)596
+1243 y(code)e(isn')o(t.)596 1376 y(All)k(of)g(these)g(functions)e(use)i
+(the)g(\002eld)g(user_data)f(from)f(the)i(corresponding)d(gda_serv)o
+(er_*)f(object)j(to)596 1468 y(store)e(nati)n(v)o(e)f(data)h
+(structures)g(of)g(the)g(database.)p Black 3601 5876
+a Fb(10)p Black eop
%%Page: 11 11
11 10 bop Black Black 197 422 a Fd(Appendix)48 b(A.)96
b(GNU)48 b(General)f(Pub)n(lic)h(License)999 644 y Fa(GNU)c(GENERAL)g
Index: gnue/docs/GDAQuickHackersGuide.rtf
diff -u gnue/docs/GDAQuickHackersGuide.rtf:1.1
gnue/docs/GDAQuickHackersGuide.rtf:1.2
--- gnue/docs/GDAQuickHackersGuide.rtf:1.1 Sat Aug 19 15:49:37 2000
+++ gnue/docs/GDAQuickHackersGuide.rtf Sun Oct 1 00:43:03 2000
@@ -5,48 +5,31 @@
}
{\colortbl;}{\stylesheet{\s1 Heading 1;}{\s2 Heading 2;}{\s3 Heading 3;}{\s4
Heading 4;}{\s5 Heading 5;}{\s6 Heading 6;}{\s7 Heading 7;}{\s8 Heading 8;}{\s9
Heading 9;}}
\deflang1024\notabind\facingp\hyphauto1\widowctrl
-\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}\pard\sl20 {\*\bkmkstart ID_GDAQUICKHACKERSGUIDE}{\*\bkmkend
ID_GDAQUICKHACKERSGUIDE}\fs20 \hyphpar0\par\pard\sb373\sl547\qc \b\fs49\f1 GNU
Enterprise : GDA Quick Hackers Guide\keepn\hyphpar0\par\pard\sl220 \b0\fs20\f0
\~\hyphpar0\par\pard\sb1991\sl380\qc \b\fs34\f1 Reinhard
M\'fcller\keepn\hyphpar0\par\pard\sl220\qc \fs24 GNU: Enterprise Core
Development Team\hyphpar0\par\pard\sb1296\sl264\qc Edited
by\keepn\hyphpar0\par\pard\sl380\qc \fs34 Derek
Neighbors\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}\pard\sl20 \fs20 \keepn\hyphpar0\par\pard\sl-240 \b\f1 GNU
Enterprise : GDA Quick Hackers Guide\hyphpar0\par\pard\sl220 \b0\f0
by\~Reinhard M\'fcller\hyphpar0\par\pard\sb220\sl220
by\~\hyphpar0\par\pard\sl220 Edited by\~Derek
Neighbors\hyphpar0\par\pard\sb220\sl220 Published Tue Aug 15 21:14:40 MST
2000\hyphpar0\par\pard\sl220 Copyright\~\'a9\~2000 by Free Software
Foundation\hyphpar0\par\pard\sb200\sl220 \fs16 Copyright (c) 2000 Free Software
Foundation\hyphpar0\par\pard\sl220 Permission is granted to copy, distribute
and/or modify this document under the terms of the GNU Free Documentation
License, Version 1.1 or any later version published by the Free Software
Foundation; with no Invariant Sections, with no Front-Cover Texts and with no
Back-Cover Texts. A copy of the license is included in the section entitled
"GNU Free Documentation
License".\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgnlcrm\pgnrestart\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{\i\fs20 \chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 \b\fs41\f1 Table of
Contents\keepn\hyphpar0\par\pard\sb207\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_INTRODUCTION}{\fldrslt \fs20\f0 1. Introduction}}\fs20\f0
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_INTRODUCTION}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_INTRODUCTION}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_WHY}{\fldrslt \b0 Why It Came About}}\b0
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l ID_WHY}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_WHY}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l ID_INTENDED}{\fldrslt Intended Audience}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_INTENDED}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_INTENDED}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l ID_SUGGESTIONS}{\fldrslt Suggestions}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_SUGGESTIONS}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_SUGGESTIONS}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_ABOUTOBJECTS}{\fldrslt \b 2. About Objects}}\b
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_ABOUTOBJECTS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_ABOUTOBJECTS}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_GENERALSTRUCTURE}{\fldrslt 3. General
Structure of GDA}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_GENERALSTRUCTURE}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_GENERALSTRUCTURE}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_GDASERVERLIB}{\fldrslt 4. GDA Server
Library}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_GDASERVERLIB}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_GDASERVERLIB}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_HELPEROBJECTS}{\fldrslt \b0 GDA_Server
Helper Objects}}\b0 \tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_HELPEROBJECTS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_HELPEROBJECTS}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_OBJECTS}{\fldrslt GDA_Server
Objects}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_OBJECTS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF ID_OBJECTS}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l ID_IMPLOBJECTS}{\fldrslt GDA_Server_Impl Objects}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_IMPLOBJECTS}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_IMPLOBJECTS}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l ID_IMPL}{\fldrslt GDA_Server_Impl}}\tqr\tldot\tx8400\tab {\field{\*\fldinst
HYPERLINK \\l ID_IMPL}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_IMPL}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_IMPLEMENTATIONS}{\fldrslt \b 5. GDA
Server Implementations}}\b \tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK
\\l ID_IMPLEMENTATIONS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_IMPLEMENTATIONS}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_CLIENTLIBRARY}{\fldrslt 6. GDA Client
Library}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_CLIENTLIBRARY}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_CLIENTLIBRARY}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_GDACLIENTOBJECTS}{\fldrslt \b0 GDA_*
Objects}}\b0 \tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_GDACLIENTOBJECTS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_GDACLIENTOBJECTS}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_GDASUBOBJECTS}{\fldrslt GDA Sub
Objects}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_GDASUBOBJECTS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_GDASUBOBJECTS}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_APPENDIXES}{\fldrslt \b I.
Appendixes}}\b \tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_APPENDIXES}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_APPENDIXES}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l _104 }{\fldrslt \b0 A. GNU General Public
License}}\b0 \tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _104
}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _104}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _107 }{\fldrslt B. GNU Free Documentation License}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l _107 }{\fldrslt {\field\flddirty{\*\fldinst
PAGEREF _107}{\fldrslt
000}}}}\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\pgnrestart\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 1. Introduction}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 1.
Introduction}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_INTRODUCTION}{\*\bkmkend ID_INTRODUCTION}\b\fs41\f1 Chapter 1.
Introduction\keepn\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
ID_WHY}{\*\bkmkend ID_WHY}\fs34 Why It Came
About\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 Some
days ago, I have spent several hours digging through the code of GDA before I
could understand the structure of GDA deeper than that it consists of a server
part and a client part. With this experience in mind, it was no surprise for me
to hear from others, that they find the code hard to understand.
\hyphpar0\par\pard\sb100\li960\sl220\qj In my personal opinion, the code is
very clear, when you only have recognized the structure how the different
functions, objects and libraries work together.
\hyphpar0\par\pard\sb100\li960\sl220\qj As I think, that GDA is a good set of
libraries, that more people should work on it and that even more people should
use it, I decided to write this "quick hacker's guide".
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart ID_INTENDED}{\*\bkmkend
ID_INTENDED}\b\fs34\lang1024\f1 Intended
Audience\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 This
document adresses people that want to understand how the code of gda works.
After reading this document, you will not understand it, but there will be
chances that you find it much easier to hack through the code than before.
\hyphpar0\par\pard\sb100\li960\sl220\qj You should read this document after
having understood the basic concepts and goals of gda (I intend you just read
the introduction on http://www.gnome.org/gnome-db) and having realized that gda
is the non-visual part of gnome-db which can be used by any application.
\hyphpar0\par\pard\sb100\li960\sl220\qj A point specially regarded in this
document is dependency on gtk/gnome, as that dependency can lead to problems
when using gda with non-gnome applications.
\hyphpar0\par\pard\sb100\li960\sl220\qj This document is (read: should be)
consistent with gnome-db.0.0.96. \hyphpar0\par\pard\sb259\s2\sl380
{\*\bkmkstart ID_SUGGESTIONS}{\*\bkmkend ID_SUGGESTIONS}\b\fs34\lang1024\f1
Suggestions\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
If you think this document is good, please feel free to read it as often as you
like and give copies of it to as many people you like.
\hyphpar0\par\pard\sb100\li960\sl220\qj Editors Note: You have to love
Reinhards attitude towards free software. :) It even carries into his
documentation! \hyphpar0\par\pard\sb100\li960\sl220\qj If you think this
document could be improved, please feel free to let me know what I could
improve or - even better - improve it yourself. Please let me know if you have
made changes, so I can merge them. \hyphpar0\par\pard\sb100\li960\sl220\qj If
you think my english is bad, please feel free to correct my mistakes and send
me the corrections for merging. \hyphpar0\par\pard\sb100\li960\sl220\qj If you
think this document should be converted to docbook, please feel free to do
that. I would agree with you very strongly :) <-- This has been done! Anyone
doing docs please feel free to write docs and we will convert. Of course we
prefer docbook natively, but we will take what we can get.
\hyphpar0\par\pard\sb100\li960\sl220\qj If you think this document is not
useful at all, please feel free to ignore it :)
\hyphpar0\par\pard\sb100\li960\sl220\qj Reinhard M\'fcller address@hidden
address@hidden
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 2. About Objects}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 2. About
Objects}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_ABOUTOBJECTS}{\*\bkmkend ID_ABOUTOBJECTS}\b\fs41\f1 Chapter 2. About
Objects\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0 In
the following, the term "objects" means not objects like in C++, but rather a
data structure plus a set of functions that deal with this structure.
\hyphpar0\par\pard\sb100\li960\sl220\qj GDA has very much an object-oriented
approach, in the sense that the internals of the data structure are virtually
not known to the "user" of the structure, but he rather uses the functions to
access them, in the sense of encapsulation.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 3. General Structure of GDA}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 3. General Structure of
GDA}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_GENERALSTRUCTURE}{\*\bkmkend ID_GENERALSTRUCTURE}\b\fs41\f1 Chapter 3.
General Structure of GDA\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj
\b0\fs20\lang1033\f0 GDA is made up of several pieces as laid out below.
\hyphpar0\par\pard\sb200\li960\sl198\qj \fs18\lang1024\f2
Application\sa0\par\fi0\sb0
+\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}\pard\sl20 {\*\bkmkstart ID_GDAQUICKHACKERSGUIDE}{\*\bkmkend
ID_GDAQUICKHACKERSGUIDE}\fs20 \hyphpar0\par\pard\sb373\sl547\qc \b\fs49\f1 GNU
Enterprise : GDA Quick Hackers Guide\keepn\hyphpar0\par\pard\sl220 \b0\fs20\f0
\~\hyphpar0\par\pard\sb1991\sl380\qc \b\fs34\f1 Reinhard
M\'fcller\keepn\hyphpar0\par\pard\sl220\qc \fs24 GNU: Enterprise Core
Development Team\hyphpar0\par\pard\sb1296\sl264\qc Edited
by\keepn\hyphpar0\par\pard\sl380\qc \fs34 Derek
Neighbors\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}\pard\sl20 \fs20 \keepn\hyphpar0\par\pard\sl-240 \b\f1 GNU
Enterprise : GDA Quick Hackers Guide\hyphpar0\par\pard\sl220 \b0\f0
by\~Reinhard M\'fcller\hyphpar0\par\pard\sb220\sl220
by\~\hyphpar0\par\pard\sl220 Edited by\~Derek
Neighbors\hyphpar0\par\pard\sb220\sl220 Published Sam Sep 30 01:13:00 CEST
2000\hyphpar0\par\pard\sl220 Copyright\~\'a9\~2000 by Free Software
Foundation\hyphpar0\par\pard\sb200\sl220 \fs16 Copyright (c) 2000 Free Software
Foundation\hyphpar0\par\pard\sl220 Permission is granted to copy, distribute
and/or modify this document under the terms of the GNU Free Documentation
License, Version 1.1 or any later version published by the Free Software
Foundation; with no Invariant Sections, with no Front-Cover Texts and with no
Back-Cover Texts. A copy of the license is included in the section entitled
"GNU Free Documentation
License".\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgnlcrm\pgnrestart\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{\i\fs20 \chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 \b\fs41\f1 Table of
Contents\keepn\hyphpar0\par\pard\sb207\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_INTRODUCTION}{\fldrslt \fs20\f0 1. Introduction}}\fs20\f0
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_INTRODUCTION}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_INTRODUCTION}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_WHY}{\fldrslt \b0 Why It Came About}}\b0
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l ID_WHY}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_WHY}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l ID_INTENDED}{\fldrslt Intended Audience}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_INTENDED}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_INTENDED}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l ID_SUGGESTIONS}{\fldrslt Suggestions}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_SUGGESTIONS}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_SUGGESTIONS}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_ABOUTOBJECTS}{\fldrslt \b 2. About Objects}}\b
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_ABOUTOBJECTS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_ABOUTOBJECTS}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_GENERALSTRUCTURE}{\fldrslt 3. General
Structure of GDA}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_GENERALSTRUCTURE}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_GENERALSTRUCTURE}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_CLIENTLIBRARY}{\fldrslt 4. GDA Client
Library}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_CLIENTLIBRARY}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_CLIENTLIBRARY}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_GDACLIENTOBJECTS}{\fldrslt \b0 gda_*
Objects}}\b0 \tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_GDACLIENTOBJECTS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_GDACLIENTOBJECTS}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_GDASTUBOBJECTS}{\fldrslt GDA Stub
Objects}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_GDASTUBOBJECTS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_GDASTUBOBJECTS}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_GDASERVERLIB}{\fldrslt \b 5. GDA Server
Library}}\b \tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_GDASERVERLIB}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_GDASERVERLIB}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_IMPLOBJECTS}{\fldrslt \b0 impl_GDA
Objects}}\b0 \tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_IMPLOBJECTS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_IMPLOBJECTS}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_OBJECTS}{\fldrslt gda_server
Objects}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_OBJECTS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF ID_OBJECTS}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l ID_HELPEROBJECTS}{\fldrslt gda_server Helper Objects}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_HELPEROBJECTS}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_HELPEROBJECTS}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l ID_IMPL}{\fldrslt gda_server_impl}}\tqr\tldot\tx8400\tab {\field{\*\fldinst
HYPERLINK \\l ID_IMPL}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_IMPL}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_PROVIDERS}{\fldrslt \b 6. GDA
Providers}}\b \tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_PROVIDERS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_PROVIDERS}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_APPENDIXES}{\fldrslt I.
Appendixes}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_APPENDIXES}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_APPENDIXES}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l _106 }{\fldrslt \b0 A. GNU General Public
License}}\b0 \tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _106
}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _106}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _109 }{\fldrslt B. GNU Free Documentation License}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l _109 }{\fldrslt {\field\flddirty{\*\fldinst
PAGEREF _109}{\fldrslt
000}}}}\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\pgnrestart\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 1. Introduction}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 1.
Introduction}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_INTRODUCTION}{\*\bkmkend ID_INTRODUCTION}\b\fs41\f1 Chapter 1.
Introduction\keepn\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
ID_WHY}{\*\bkmkend ID_WHY}\fs34 Why It Came
About\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 When I
had my first look at gda, I spent several hours digging through the code of GDA
before I could understand the structure of GDA deeper than that it consists of
a server part and a client part. With this experience in mind, it was no
surprise for me to hear from others, that they find the code hard to
understand. \hyphpar0\par\pard\sb100\li960\sl220\qj In my personal opinion,
the code is very clear, when you only have recognized the structure how the
different functions, objects and libraries work together.
\hyphpar0\par\pard\sb100\li960\sl220\qj As I think, that GDA is a good set of
libraries, that more people should work on it and that even more people should
use it, I decided to write this "quick hacker's guide".
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart ID_INTENDED}{\*\bkmkend
ID_INTENDED}\b\fs34\lang1024\f1 Intended
Audience\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
This document adresses people that want to understand how the code of GDA
works. After reading this document, you will not understand it, but there will
be chances that you find it much easier to hack through the code than before.
\hyphpar0\par\pard\sb100\li960\sl220\qj You should read this document after
having understood the basic concepts and goals of GDA (I intend you just read
the introduction on http://www.gnome.org/gnome-db) and having realized that GDA
is the non-visual part of gnome-db which can be used by any application.
(Actually, GDA has been seperated from the rest of gnome-db in release 0.1.0,
but is still maintained by the gnome-db project team)
\hyphpar0\par\pard\sb100\li960\sl220\qj A point specially regarded in this
document is dependency on gtk/gnome, as that dependency can lead to problems
when using gda with non-gnome applications. However, there are chances that
these dependencies will be removed before the release of 0.1.1. As they are a
very fast moving target already, the information here is maybe not up to date;
I will remove all these dependency discussions in one of the next versions of
the document. \hyphpar0\par\pard\sb100\li960\sl220\qj Please note that this
document represents my personal view of things, and contains facts (or what I
think is a fact) as well as some subjective opinions. Of course I will change
the document if a fact ceases to be correct or was incorrect from the
beginning, but I also will gladly change the subjective parts of the text if
somebody manages to change my opinion ;-).
\hyphpar0\par\pard\sb100\li960\sl220\qj This document is (read: should be)
consistent with libgda-0.1.0. \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
ID_SUGGESTIONS}{\*\bkmkend ID_SUGGESTIONS}\b\fs34\lang1024\f1
Suggestions\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
If you think this document is good, please feel free to read it as often as you
like and give copies of it to as many people you like.
\hyphpar0\par\pard\sb100\li960\sl220\qj If you think this document could be
improved, please feel free to let me know what I could improve or - even better
- improve it yourself. Please let me know if you have made changes, so I can
merge them. \hyphpar0\par\pard\sb100\li960\sl220\qj If you think my english is
bad, please feel free to correct my mistakes and send me the corrections for
merging. \hyphpar0\par\pard\sb100\li960\sl220\qj If you think this document is
not useful at all, please feel free to ignore it :)
\hyphpar0\par\pard\sb100\li960\sl220\qj Reinhard M\'fcller (address@hidden)
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 2. About Objects}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 2. About
Objects}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_ABOUTOBJECTS}{\*\bkmkend ID_ABOUTOBJECTS}\b\fs41\f1 Chapter 2. About
Objects\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0 In
the following, the term "objects" means not objects like in C++, but rather a
data structure plus a set of functions that deal with this
structure.\hyphpar0\par\pard\sb100\li960\sl220\qj GDA has very much an
object-oriented approach, in the sense that the internals of the data structure
are virtually not known to the "user" of the structure, but he rather uses the
functions to access them, in the sense of
encapsulation.\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 3. General Structure of GDA}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 3. General Structure of
GDA}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_GENERALSTRUCTURE}{\*\bkmkend ID_GENERALSTRUCTURE}\b\fs41\f1 Chapter 3.
General Structure of GDA\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj
\b0\fs20\lang1033\f0 GDA is made up of several pieces as laid out
below.\hyphpar0\par\pard\sb200\li960\sl198\qj \fs18\lang1024\f2
Application\sa0\par\fi0\sb0
|\sa0\par\fi0\sb0
|(calls directly)\sa0\par\fi0\sb0
|\sa0\par\fi0\sb0
-gda-* objects \\\sa0\par\fi0\sb0
-| \\\sa0\par\fi0\sb0
-|(calls directly) > libgda-client (directory
gda-clnt)\sa0\par\fi0\sb0
-| / \sa0\par\fi0\sb0
-gda-stubs objects /\sa0\par\fi0\sb0
+gda-* objects \\\sa0\par\fi0\sb0
+| \\\sa0\par\fi0\sb0
+|(calls directly) > libgda-client (directory
lib/gda-clnt)\sa0\par\fi0\sb0
+| / \sa0\par\fi0\sb0
+gda-stubs objects /\sa0\par\fi0\sb0
|\sa0\par\fi0\sb0
|(calls via ORBIT)\sa0\par\fi0\sb0
|\sa0\par\fi0\sb0
-gda-server-impl objects \\\sa0\par\fi0\sb0
-| \\\sa0\par\fi0\sb0
-|(calls) > libgda-server (directory
gda-srv)\sa0\par\fi0\sb0
-| /\sa0\par\fi0\sb0
-gda-server objects /\sa0\par\fi0\sb0
+gda-server-impl objects \\\sa0\par\fi0\sb0
+| \\\sa0\par\fi0\sb0
+|(calls directly) > libgda-server (directory
lib/gda-srv)\sa0\par\fi0\sb0
+| /\sa0\par\fi0\sb0
+gda-server objects /\sa0\par\fi0\sb0
|\sa0\par\fi0\sb0
|(calls via callback functions)\sa0\par\fi0\sb0
|\sa0\par\fi0\sb0
-gda-??? implementations libgda-??? (directories
gda-*-server)\sa0\par\fi0\sb0
+gda-??? implementations provider (directories
providers/gda-*-server)\sa0\par\fi0\sb0
|\sa0\par\fi0\sb0
|(calls directly)\sa0\par\fi0\sb0
|\sa0\par\fi0\sb0
-Database Backend\sa0\par\fi0\sb0
-
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 4. GDA Server Library}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 4. GDA Server
Library}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_GDASERVERLIB}{\*\bkmkend ID_GDASERVERLIB}\b\fs41\f1 Chapter 4. GDA Server
Library\keepn\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
ID_HELPEROBJECTS}{\*\bkmkend ID_HELPEROBJECTS}\fs34 GDA_Server Helper
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 The
following objects are absolute low-level helper objects designed to ease the
developement of gda server implementations:
\hyphpar0\par\pard\sb200\li960\sl198\qj \fs18\lang1024\f2 function prefix
data structure source file\sa0\par\fi0\sb0
-gda_server_error Gda_ServerError gda-server-error.c\sa0\par\fi0\sb0
-gda_server_field Gda_ServerField gda-server-field.c\sa0\par\fi0\sb0
- \hyphpar0\par\pard\sb200\li960\sl220\qj \fs20\lang1033\f0 This code is
dependent from nothing but glib and some typedefs from gda.h
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart ID_OBJECTS}{\*\bkmkend
ID_OBJECTS}\b\fs34\lang1024\f1 GDA_Server
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 The
following objects build the base of the gda providers:
\hyphpar0\par\pard\sb200\li960\sl198\qj \fs18\lang1024\f2 function prefix
data structure source file\sa0\par\fi0\sb0
-gda_server_command Gda_ServerCommand
gda-server-command.c\sa0\par\fi0\sb0
-gda_server_connection Gda_ServerConnection
gda-server-connection.c\sa0\par\fi0\sb0
-gda_server_recordset Gda_ServerRecordset
gda-server-recordset.c\sa0\par\fi0\sb0
- \hyphpar0\par\pard\sb200\li960\sl220\qj \fs20\lang1033\f0 The code of these
objects is really neither gnome nor gtk dependent. CORBA dependency is only
because they use some types defined in the idl.
\hyphpar0\par\pard\sb100\li960\sl220\qj Unfortunately, the header file
gda-server-impl.h is very general (it's used by all sources in the gda-srv
directory) and thus contains much stuff that wouldn't be needed by these files.
So you can't even compile the above sources without gnome or gtk although the
code itself wouldn't need it. \hyphpar0\par\pard\sb100\li960\sl220\qj These
objects can very much be regarded as "abstract" objects. Each provider must
"overload" certain functions. This happens by providing a list of functions
when starting the server code, from where the gda_server_* objects take the
functions to really call. \hyphpar0\par\pard\sb100\li960\sl220\qj Each of these
objects provide a member "user_data" that can be used by the specific provider
code to store backend specific data structures.
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart ID_IMPLOBJECTS}{\*\bkmkend
ID_IMPLOBJECTS}\b\fs34\lang1024\f1 GDA_Server_Impl
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
Around the gda-server objects, another layer is built to match the complete idl
of gda. \hyphpar0\par\pard\sb200\li960\sl198\qj \fs18\lang1024\f2 function
prefix data structure source file\sa0\par\fi0\sb0
-impl_GDA_Parameter impl_POA_GDA_Parameter
gda-server-impl-command.c\sa0\par\fi0\sb0
-impl_GDA_Command impl_POA_GDA_Command
gda-server-impl-command.c\sa0\par\fi0\sb0
-impl_GDA_Connection impl_POA_GDA_Connection
gda-server-impl-connection.c\sa0\par\fi0\sb0
-impl_GDA_Recordset impl_POA_GDA_Recordset
gda-server-impl-recordset.c\sa0\par\fi0\sb0
- \hyphpar0\par\pard\sb200\li960\sl220\qj \fs20\lang1033\f0 These objects are
neither gnome nor gtk dependent. But they make up complete CORBA-enabled
objects matching gda.idl. \hyphpar0\par\pard\sb100\li960\sl220\qj One could
regard these objects as "wrappers" around the gda-server objects to make them
match CORBA specifications. \hyphpar0\par\pard\sb100\li960\sl220\qj There is no
gda_server_parameter yet as none of the methods of gda_server_parameter are yet
implemented :) \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
ID_IMPL}{\*\bkmkend ID_IMPL}\b\fs34\lang1024\f1
GDA_Server_Impl\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 Unfortunately there is an own object called
gda-server-impl which has nothing to do with the gda-server-impl-* objects.
\hyphpar0\par\pard\sb200\li960\sl198\qj \fs18\lang1024\f2 function prefix
data structure source file\sa0\par\fi0\sb0
-gda_server_impl Gda_ServerImpl
gda-server-impl.c\sa0\par\fi0\sb0
-impl_GDA_ConnectionFactory impl_POA_GDA_ConnectionFactory\sa0\par\fi0\sb0
-gda-server-factory.c\sa0\par\fi0\sb0
- \hyphpar0\par\pard\sb200\li960\sl220\qj \fs20\lang1033\f0 gda_server_impl is
a gtk object that represents an instance of a running server. It is used for
tasks like registering the server into the system, creating the factory etc.
\hyphpar0\par\pard\sb100\li960\sl220\qj GDA_ConnectionFactory is a CORBA object
that is able to create new GDA_Connection CORBA objects. It's gnome dependent.
\hyphpar0\par\pard\sb100\li960\sl220\qj These two objects are really gtk and
gnome dependent. The dependency results from the way how CORBA servers are
registered into the system so that clients have a convenient way to find the
server they want. \hyphpar0\par\pard\sb100\li960\sl220\qj Hopefully these
dependencies will be removed when OAF is used.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 5. GDA Server Implementations}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 5. GDA Server
Implementations}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_IMPLEMENTATIONS}{\*\bkmkend ID_IMPLEMENTATIONS}\b\fs41\f1 Chapter 5. GDA
Server Implementations\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj
\b0\fs20\lang1033\f0 The actual server implementation just implements the
missing functions mentioned under "gda_server object".
\hyphpar0\par\pard\sb100\li960\sl220\qj These functions are implemented in
gda-???-command.c, gda-???-connection.c and gda-???-recordset.c. The main-???.c
source contains the main() routine for the server executable, which does
nothing but initialize corba, create a gda_server_impl object and pass to it
the list of function implementations. The main() function thus is
gnome-dependent, the rest of the code isn't.
\hyphpar0\par\pard\sb100\li960\sl220\qj All of these functions use the field
user_data from the corresponding gda_server_* object to store native data
structures of the database. \hyphpar0\par\pard\sb100\li960\sl220\qj Some GDA
servers also implement a configuration tool, which is named gda-???-config and
has absolutely nothing to do with the implementation of the server, as it's a
totally high-level application.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 6. GDA Client Library}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 6. GDA Client
Library}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_CLIENTLIBRARY}{\*\bkmkend ID_CLIENTLIBRARY}\b\fs41\f1 Chapter 6. GDA Client
Library\keepn\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
ID_GDACLIENTOBJECTS}{\*\bkmkend ID_GDACLIENTOBJECTS}\fs34 GDA_*
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 The
following objects are very much real objects in the sense that they are
currently implemented as real GtkObjects, wich will soon be changed into
GObject to make them all Gtk independent.
\hyphpar0\par\pard\sb200\li960\sl198\qj \fs18\lang1024\f2 function prefix
data structure source file\sa0\par\fi0\sb0
+Database Backend\hyphpar0\par\pard\sb200\li960\sl220\qj \fs20\lang1033\f0
Between the client and the server, there is the GDA CORBA interface, defined by
the IDL files in the idl directory. Note that these IDL files contain a lot of
methods that are neither used nor implemented, and some of them probably never
will, at least not exactly as they are written down now. So please don't rely
on all the methods being there if you use the IDL file directly; use only the
methods that are already implemented server-sided and wrapped in the client
library. Maybe someday the IDL files will be cleaned
up.\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 4. GDA Client Library}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 4. GDA Client
Library}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_CLIENTLIBRARY}{\*\bkmkend ID_CLIENTLIBRARY}\b\fs41\f1 Chapter 4. GDA Client
Library\keepn\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
ID_GDACLIENTOBJECTS}{\*\bkmkend ID_GDACLIENTOBJECTS}\fs34 gda_*
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 The
following objects are very much real objects in the sense that they are
currently implemented as real GtkObjects, wich will soon be changed into
GObject to make them all Gtk independent.
\hyphpar0\par\pard\sb200\li960\sl198\qj \fs18\lang1024\f2 function prefix
data structure source file\sa0\par\fi0\sb0
gda_batch Gda_Batch gda-batch.c\sa0\par\fi0\sb0
gda_command Gda_Command gda-command.c\sa0\par\fi0\sb0
gda_connection Gda_Connection gda-connection.c\sa0\par\fi0\sb0
@@ -54,13 +37,29 @@
gda_error Gda_Error gda-error.c\sa0\par\fi0\sb0
gda_field Gda_Field gda-field.c\sa0\par\fi0\sb0
gda_recordset Gda_Recordset gda-recordset.c\sa0\par\fi0\sb0
- \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart ID_GDASUBOBJECTS}{\*\bkmkend
ID_GDASUBOBJECTS}\b\fs34\f1 GDA Sub
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 The
code for the stub implementation is generated by orbit-idl automagically.
Anyway, as it is its own layer, and the functions are called by the above gda_*
objects, they are listed below: \hyphpar0\par\pard\sb200\li960\sl198\qj
\fs18\lang1024\f2 function prefix data structure source file\sa0\par\fi0\sb0
-GDA_Fieldx GDA_Fieldx gda-stubs.c\sa0\par\fi0\sb0
-GDA_Parameter GDA_Parameter gda-stubs.c\sa0\par\fi0\sb0
-GDA_Command GDA_Command gda-stubs.c\sa0\par\fi0\sb0
-GDA_Connection GDA_Connection gda-stubs.c\sa0\par\fi0\sb0
-GDA_Recordset GDA_Recordset gda-stubs.c\sa0\par\fi0\sb0
- \hyphpar0\par\pard\sb200\li960\sl220\qj \fs20\lang1033\f0 The GDA_Fieldx
stub seems to be neither used from the gda-client library nor implemented by
the gda-server library.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Appendix A. GNU General Public License}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Appendix A. GNU General Public
License}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_APPENDIXES}{\*\bkmkend ID_APPENDIXES}{\*\bkmkstart _104}{\*\bkmkend
_104}\b\fs41\f1 Appendix A. GNU General Public License
\keepn\hyphpar0\par\pard\sb207\li960\sl198\qj \b0\fs18\f2
GNU GENERAL PUBLIC LICENSE\sa0\par\fi0\sb0
+ \hyphpar0\par\pard\sb200\li960\sl220\qj \fs20\lang1033\f0 These objects are
the ones directly used by GDA client programs. They are extensively described
in the available documentation. \hyphpar0\par\pard\sb100\li960\sl220\qj
Although these objects have very much built-in functionality they provide by
themselves, they can simplistically be regarded as wrappers around the CORBA
objects defined in gda.idl. Therefore, many of the object functions simply call
the appropriate underlying CORBA Stub function.
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart ID_GDASTUBOBJECTS}{\*\bkmkend
ID_GDASTUBOBJECTS}\b\fs34\lang1024\f1 GDA Stub
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 The
code for the stub implementation is generated by orbit-idl automagically.
Anyway, as it is its own layer, and the functions are called by the above gda_*
objects, they are listed below: \hyphpar0\par\pard\sb200\li960\sl198\qj
\fs18\lang1024\f2 function prefix data structure source
file\sa0\par\fi0\sb0
+GDA_Fieldx GDA_Fieldx gda-stubs.c\sa0\par\fi0\sb0
+GDA_Parameter GDA_Parameter gda-stubs.c\sa0\par\fi0\sb0
+GDA_Command GDA_Command gda-stubs.c\sa0\par\fi0\sb0
+GDA_Connection GDA_Connection gda-stubs.c\sa0\par\fi0\sb0
+GDA_Recordset GDA_Recordset gda-stubs.c\sa0\par\fi0\sb0
+GDA_ConnectionFactory GDA_ConnectionFactory gda-stubs.c\sa0\par\fi0\sb0
+ \hyphpar0\par\pard\sb200\li960\sl220\qj \fs20\lang1033\f0 The GDA_Fieldx
stub seems to be neither used from the gda-client library nor implemented by
the gda-server library. It's either a remnant of the past or a start of a
feature that will be created in the future.
\hyphpar0\par\pard\sb100\li960\sl220\qj The GDA_Parameter stub is not used by
any of the gda_* objects. This is probably reserved for future use.
\hyphpar0\par\pard\sb100\li960\sl220\qj The GDA_ConnectionFactory is used by
gda_connection to create a new connection.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 5. GDA Server Library}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 5. GDA Server
Library}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_GDASERVERLIB}{\*\bkmkend ID_GDASERVERLIB}\b\fs41\f1 Chapter 5. GDA Server
Library\keepn\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
ID_IMPLOBJECTS}{\*\bkmkend ID_IMPLOBJECTS}\fs34 impl_GDA
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 Now
we move on the server side of the CORBA connection. These objects are the
implementation of the GDA CORBA interface.
\hyphpar0\par\pard\sb200\li960\sl198\qj \fs18\lang1024\f2 function prefix
data structure source file\sa0\par\fi0\sb0
+impl_GDA_Parameter impl_POA_GDA_*
gda-server-impl-command.c\sa0\par\fi0\sb0
+impl_GDA_Command impl_POA_GDA_*
gda-server-impl-command.c\sa0\par\fi0\sb0
+impl_GDA_Connection impl_POA_GDA_*
gda-server-impl-connection.c\sa0\par\fi0\sb0
+impl_GDA_Recordset impl_POA_GDA_*
gda-server-impl-recordset.c\sa0\par\fi0\sb0
+impl_GDA_ConnectionFactory impl_POA_GDA_*
gda-server-impl-factory.c\sa0\par\fi0\sb0
+ \hyphpar0\par\pard\sb200\li960\sl220\qj \fs20\lang1033\f0 These objects are
neither gnome nor gtk dependent. But they make up complete CORBA-enabled
objects matching gda.idl. \hyphpar0\par\pard\sb100\li960\sl220\qj One could
regard these objects as "wrappers" around the gda-server objects to make them
match CORBA specifications; only the ConnectionFactory object has no underlying
gda_server-object. \hyphpar0\par\pard\sb100\li960\sl220\qj There is no
gda_server_parameter yet as none of the methods of gda_server_parameter are yet
implemented :) \hyphpar0\par\pard\sb100\li960\sl220\qj Note that there is a
source file called gda-server-impl.c which is, unlike the above source files,
not the implementation of a CORBA interface. \hyphpar0\par\pard\sb259\s2\sl380
{\*\bkmkstart ID_OBJECTS}{\*\bkmkend ID_OBJECTS}\b\fs34\lang1024\f1 gda_server
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 The
following objects build the base of the gda providers:
\hyphpar0\par\pard\sb200\li960\sl198\qj \fs18\lang1024\f2 function prefix
data structure source file\sa0\par\fi0\sb0
+gda_server_command Gda_ServerCommand
gda-server-command.c\sa0\par\fi0\sb0
+gda_server_connection Gda_ServerConnection
gda-server-connection.c\sa0\par\fi0\sb0
+gda_server_recordset Gda_ServerRecordset
gda-server-recordset.c\sa0\par\fi0\sb0
+ \hyphpar0\par\pard\sb200\li960\sl220\qj \fs20\lang1033\f0 The code of these
objects is really neither gnome nor gtk dependent. CORBA dependency is only
because they use some types defined in the idl.
\hyphpar0\par\pard\sb100\li960\sl220\qj Unfortunately, the header file
gda-server-impl.h is very general (it's used by all sources in the gda-srv
directory) and thus contains much stuff that wouldn't be needed by these files.
So you can't even compile the above sources without gnome or gtk although the
code itself wouldn't need it. \hyphpar0\par\pard\sb100\li960\sl220\qj These
objects can very much be regarded as "abstract" objects. Each provider must
"overload" certain functions. This happens by providing a list of functions
when starting the server code, from where the gda_server_* objects take the
functions to really call. \hyphpar0\par\pard\sb100\li960\sl220\qj Each of
these objects provide a member "user_data" that can be used by the specific
provider code to store backend specific data structures.
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart ID_HELPEROBJECTS}{\*\bkmkend
ID_HELPEROBJECTS}\b\fs34\lang1024\f1 gda_server Helper
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 The
following objects are absolute low-level helper objects designed to ease the
developement of gda server implementations:
\hyphpar0\par\pard\sb200\li960\sl198\qj \fs18\lang1024\f2 function prefix
data structure source file\sa0\par\fi0\sb0
+gda_server_error Gda_ServerError gda-server-error.c\sa0\par\fi0\sb0
+gda_server_field Gda_ServerField gda-server-field.c\sa0\par\fi0\sb0
+ \hyphpar0\par\pard\sb200\li960\sl220\qj \fs20\lang1033\f0 This code is
dependent from nothing but glib and some typedefs from gda.h
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart ID_IMPL}{\*\bkmkend
ID_IMPL}\b\fs34\lang1024\f1
gda_server_impl\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 Unfortunately there is an own object called
gda-server-impl which has nothing to do with the gda-server-impl-* objects.
\hyphpar0\par\pard\sb200\li960\sl198\qj \fs18\lang1024\f2 function prefix
data structure source file\sa0\par\fi0\sb0
+gda_server_impl Gda_ServerImpl
gda-server-impl.c\sa0\par\fi0\sb0
+ \hyphpar0\par\pard\sb200\li960\sl220\qj \fs20\lang1033\f0 gda_server_impl
is a gtk object (the only one in the server library) that represents an
instance of a running server. It is used for tasks like registering the server
into the system, creating the factory etc. It is mainly used by the providers.
Also, the list of callback functions is stored in the data structure of
Gda_ServerImpl. \hyphpar0\par\pard\sb100\li960\sl220\qj Note that the
functions gda_server_impl_exception, gda_server_impl_make_error_buffer and
gda_server_impl_find can not be regarded as methods of the gda_server_impl
pseudo-object, but are rather unrelated helper functions that are used by the
gda-server library itself and/or by the providers.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 6. GDA Providers}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 6. GDA
Providers}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_PROVIDERS}{\*\bkmkend ID_PROVIDERS}\b\fs41\f1 Chapter 6. GDA
Providers\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0
The actual provider implementation just implements the missing functions
mentioned under "gda_server objects".\hyphpar0\par\pard\sb100\li960\sl220\qj
These functions are implemented in gda-???-command.c, gda-???-connection.c and
gda-???-recordset.c. The main-???.c source contains the main() routine for the
server executable, which does nothing but initialize corba, create a
gda_server_impl object and pass to it the list of function implementations. The
main() function thus is GTK-dependent, the rest of the code
isn't.\hyphpar0\par\pard\sb100\li960\sl220\qj All of these functions use the
field user_data from the corresponding gda_server_* object to store native data
structures of the
database.\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Appendix A. GNU General Public License}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Appendix A. GNU General Public
License}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_APPENDIXES}{\*\bkmkend ID_APPENDIXES}{\*\bkmkstart _106}{\*\bkmkend
_106}\b\fs41\f1 Appendix A. GNU General Public License
\keepn\hyphpar0\par\pard\sb207\li960\sl198\qj \b0\fs18\f2 GNU
GENERAL PUBLIC LICENSE\sa0\par\fi0\sb0
Version 2, June 1991\sa0\par\fi0\sb0
\sa0\par\fi0\sb0
Copyright (C) 1989, 1991 Free Software Foundation, Inc.\sa0\par\fi0\sb0
@@ -401,7 +400,7 @@
library. If this is what you want to do, use the GNU Library
General\sa0\par\fi0\sb0
Public License instead of this License.\sa0\par\fi0\sb0
\sa0\par\fi0\sb0
-
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Appendix B. GNU Free Documentation License}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Appendix B. GNU Free Documentation
License}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
_107}{\*\bkmkend _107}\b\fs41\f1 Appendix B. GNU Free Documentation License
\keepn\hyphpar0\par\pard\sb207\li960\sl198\qj \b0\fs18\f2 GNU
Free Documentation License\sa0\par\fi0\sb0
+
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Appendix B. GNU Free Documentation License}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Appendix B. GNU Free Documentation
License}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
_109}{\*\bkmkend _109}\b\fs41\f1 Appendix B. GNU Free Documentation License
\keepn\hyphpar0\par\pard\sb207\li960\sl198\qj \b0\fs18\f2 GNU
Free Documentation License\sa0\par\fi0\sb0
Version 1.1, March 2000\sa0\par\fi0\sb0
\sa0\par\fi0\sb0
Copyright (C) 2000 Free Software Foundation, Inc.\sa0\par\fi0\sb0
Index: gnue/docs/GNUeObjectServer.pdf
Index: gnue/docs/GNUeObjectServer.ps
diff -u gnue/docs/GNUeObjectServer.ps:1.1 gnue/docs/GNUeObjectServer.ps:1.2
--- gnue/docs/GNUeObjectServer.ps:1.1 Wed Sep 20 23:33:43 2000
+++ gnue/docs/GNUeObjectServer.ps Sun Oct 1 00:43:03 2000
@@ -1,7 +1,7 @@
%!PS-Adobe-2.0
%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software
%%Title: main.dvi
-%%Pages: 35
+%%Pages: 36
%%PageOrder: Ascend
%%BoundingBox: 0 0 596 842
%%DocumentFonts: Helvetica-Bold Times-Roman Times-Bold Times-Italic
@@ -10,7 +10,7 @@
%DVIPSWebPage: (www.radicaleye.com)
%DVIPSCommandLine: dvips main.dvi -o main.ps
%DVIPSParameters: dpi=600, compressed
-%DVIPSSource: TeX output 2000.09.20:2323
+%DVIPSSource: TeX output 2000.09.28:0752
%%BeginProcSet: texc.pro
%!
/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
@@ -320,28 +320,28 @@
45 45 45 45 5[45 45 45 45 45 45 45 45 45 45 45 45 45
45 45 45 2[45 45 45 4[45 34[{TeXBase1Encoding ReEncodeFont}72
74.7198 /Courier rf /Fb 134[37 37 2[42 23 32 32 1[42
-42 42 60 23 2[23 42 42 1[37 42 37 42 42 11[60 46 3[51
-1[55 1[46 4[60 51 1[60 55 51 51 7[42 42 42 42 42 42 42
-42 42 42 1[21 46[{TeXBase1Encoding ReEncodeFont}41 83.022
-/Times-Italic rf /Fc 133[37 42 42 60 42 46 28 32 37 1[46
-42 46 69 23 1[28 23 46 42 28 37 46 37 46 42 11[60 55
-46 60 1[51 65 60 78 3[32 4[60 60 55 60 7[42 42 42 42
-42 42 42 42 42 42 1[21 46[{TeXBase1Encoding ReEncodeFont}48
+42 42 60 23 1[23 23 42 42 1[37 42 37 42 42 11[60 46 1[51
+1[51 60 55 1[46 4[60 51 1[60 55 51 51 7[42 42 42 42 42
+42 42 42 42 42 1[21 46[{TeXBase1Encoding ReEncodeFont}44
+83.022 /Times-Italic rf /Fc 133[37 42 42 60 42 46 28
+32 37 1[46 42 46 69 23 1[28 23 46 42 28 37 46 37 46 42
+11[60 55 46 60 1[51 65 60 78 3[32 4[60 60 55 60 7[42
+42 42 42 42 42 42 42 42 42 1[21 46[{TeXBase1Encoding ReEncodeFont}48
83.022 /Times-Bold rf /Fd 133[86 96 96 134 96 105 57
96 67 1[105 105 105 153 48 1[48 48 105 105 57 96 105
96 105 96 11[124 105 115 124 1[115 134 124 143 105 2[48
1[134 105 1[124 124 124 124 7[96 96 96 96 96 96 96 96
96 96 1[48 46[{TeXBase1Encoding ReEncodeFont}51 172.154
-/Helvetica-Bold rf /Fe 134[33 33 48 33 33 18 26 22 1[33
-33 33 52 18 33 1[18 33 33 22 29 33 29 33 29 10[48 48
-41 37 2[37 1[48 1[41 2[22 1[48 37 1[48 44 44 48 5[18
+/Helvetica-Bold rf /Fe 106[23 27[33 33 48 33 33 18 26
+22 1[33 33 33 52 18 33 1[18 33 33 22 29 33 29 33 29 10[48
+48 41 37 2[37 1[48 1[41 2[22 1[48 37 1[48 44 44 48 5[18
8[33 33 33 18 17 22 17 2[22 22 5[27 34[{TeXBase1Encoding ReEncodeFont}
-48 66.4176 /Times-Roman rf /Ff 86[63 46[37 42 42 60 42
+49 66.4176 /Times-Roman rf /Ff 86[63 46[37 42 42 60 42
42 23 32 28 42 42 42 42 65 23 42 23 23 42 42 28 37 42
37 42 37 1[42 1[28 1[28 1[60 60 78 1[60 51 46 55 60 46
60 60 74 51 1[32 28 60 60 46 51 60 55 55 60 1[37 1[47
-1[23 23 42 2[42 42 42 42 42 42 42 23 21 28 21 47 1[28
-28 28 65 3[34 28 29[46 46 2[{TeXBase1Encoding ReEncodeFont}78
+1[23 23 3[42 42 42 42 42 42 42 23 21 28 21 47 1[28 28
+28 65 3[34 28 29[46 46 2[{TeXBase1Encoding ReEncodeFont}77
83.022 /Times-Roman rf /Fg 137[46 51 28 46 32 1[51 51
51 1[23 1[23 23 3[46 51 46 51 46 11[60 1[55 2[55 65 60
6[65 1[55 23[28 45[{TeXBase1Encoding ReEncodeFont}24
@@ -1396,7 +1396,7 @@
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
-Black(19)596 3476 y(15.)g(Data)g(T)-6 b(ypes)p Black
+Black(20)596 3476 y(15.)g(Data)g(T)-6 b(ypes)p Black
14 w(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
@@ -1435,7 +1435,7 @@
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
-Black(20)795 3587 y Ff(T)g(e)o(xt)p Black 4 w(.)p Black
+Black(21)795 3587 y Ff(T)g(e)o(xt)p Black 4 w(.)p Black
Black -1 w(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
@@ -1476,7 +1476,7 @@
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
-Black -1 w(.)p Black Black(.)p Black(20)795 3678 y(Numeric)p
+Black -1 w(.)p Black Black(.)p Black(21)795 3678 y(Numeric)p
Black 4 w(.)p Black Black -2 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
@@ -1515,7 +1515,7 @@
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
-Black Black -1 w(.)p Black Black(.)p Black(20)795 3769
+Black Black -1 w(.)p Black Black(.)p Black(21)795 3769
y(Mone)o(y/Currenc)o(y)p Black 16 w(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
@@ -1550,7 +1550,7 @@
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
-Black Black -1 w(.)p Black Black(.)p Black(20)795 3861
+Black Black -1 w(.)p Black Black(.)p Black(21)795 3861
y(Date/T)m(ime)p Black 5 w(.)p Black Black -1 w(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
@@ -1589,7 +1589,7 @@
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
-Black(.)p Black(20)795 3952 y(Summary)p Black 13 w(.)p
+Black(.)p Black(21)795 3952 y(Summary)p Black 13 w(.)p
Black Black -2 w(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
@@ -1627,7 +1627,7 @@
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
-Black(.)p Black Black -1 w(.)p Black Black(.)p Black(20)596
+Black(.)p Black Black -1 w(.)p Black Black(.)p Black(21)596
4063 y Fc(16.)19 b(Security)p Black 12 w(.)p Black Black
-1 w(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
@@ -1668,7 +1668,7 @@
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
-Black(.)p Black(22)596 4175 y(I.)h(A)n(ppendixes)p Black
+Black(.)p Black(23)596 4175 y(I.)h(A)n(ppendixes)p Black
7 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
@@ -1707,7 +1707,7 @@
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
Black Black(.)p Black Black(.)p Black Black(.)p Black
-Black -1 w(.)p Black Black(.)p Black(23)795 4286 y Ff(A.)g(GNU)h
+Black -1 w(.)p Black Black(.)p Black(24)795 4286 y Ff(A.)g(GNU)h
(General)e(Public)h(License)p Black 7 w(.)p Black Black
-1 w(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p
Black Black(.)p Black Black(.)p Black Black -1 w(.)p
@@ -1735,7 +1735,7 @@
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
Black Black -1 w(.)p Black Black(.)p Black Black(.)p
Black Black(.)p Black Black -1 w(.)p Black Black(.)p
-Black(23)795 4377 y(B.)h(GNU)f(Free)h(Documentation)c(License)p
+Black(24)795 4377 y(B.)h(GNU)f(Free)h(Documentation)c(License)p
Black 14 w(.)p Black Black -1 w(.)p Black Black(.)p Black
Black -1 w(.)p Black Black(.)p Black Black(.)p Black
Black(.)p Black Black -1 w(.)p Black Black(.)p Black
@@ -1759,7 +1759,7 @@
Black(.)p Black Black(.)p Black Black -1 w(.)p Black
Black(.)p Black Black(.)p Black Black(.)p Black Black
-1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p
-Black Black -1 w(.)p Black Black(.)p Black(29)p Black
+Black Black -1 w(.)p Black Black(.)p Black(30)p Black
3642 5876 a Fb(3)p Black eop
%%Page: 4 4
4 3 bop Black Black 197 422 a Fd(Chapter)48 b(1.)g(Over)r(vie)m(w)596
@@ -1862,40 +1862,52 @@
2190 y(usage.)30 b(Installation)g(of)g(ne)n(w)h(modules)f(will)i
(require)d(automated)g(tools)i(that)g(set)h(up)e(databases)h(and)596
2281 y(object)19 b(serv)o(ers)h(correctly)-5 b(.)596
-2414 y(Example)18 b(of)i(a)h(\(relati)n(v)o(ely)e(simple\))g(multi)i
-(serv)o(er)e(system:)596 2547 y(A)g(chain)f(of)g(stores)h(runs)f(a)h
-(single)f(computer)f(in)i(each)f(store)g(to)h(manage)e(that)i(store')-5
-b(s)19 b(database.)f(Ev)o(en)f(if)596 2638 y(netw)o(ork)i(links)i(f)o
-(ail,)g(the)f(LAN)h(in)g(the)g(store)f(will)i(still)g(operate)d
-(correctly)-5 b(.)19 b(A)i(computer)e(at)i(head)f(of)n(\002ce)596
-2730 y(can)26 b(connect)g(to)g(the)h(store)g(systems)g(at)g
-(appropriate)e(times)i(to)g(retrie)n(v)o(e)e(accounting)g(information.)
-f(A)596 2821 y(store)29 b(manager)e(can)i(tak)o(e)g(a)g(laptop)g(with)g
-(another)e(object)i(serv)o(er)f(home,)g(and)g(use)i(this)f(to)g(access)
-h(a)596 2912 y(database)19 b(-)h(the)h(object)e(serv)o(er)g(on)h(the)g
-(laptop)g(will)g(manage)f(b)n(uf)n(fering)f(of)i(data)g(to)g(optimise)g
-(useage)g(of)596 3004 y(the)k(slo)n(w)h(netw)o(ork)f(link.)g(The)h
-(store)f(computers)f(can)i(access)g(the)g(compan)o(y')-5
-b(s)23 b(w)o(arehouse)g(to)i(request)596 3095 y(ne)n(w)g(stock)h
-(shipments,)f(and)g(the)h(w)o(arehouse)f(can,)g(in)h(turn,)f(arrange)g
-(purcahses)f(of)i(ne)n(w)g(stock)g(from)596 3186 y(suppliers,)19
-b(either)h(automatically)e(or)i(with)h(manual)e(appro)o(v)n(al.)596
-3319 y(In)31 b(this)h(system,)f(the)h(GNUe)g(object)f(serv)o(er)f(will)
-j(pro)o(vide)c(the)j(data)f(management)e(system,)j(F)o(orms)596
-3410 y(w)o(ould)19 b(run)h(the)h(user)f(interf)o(ace)g(for)g(v)n
-(arious)f(applications)g(such)i(as)g(point)f(of)g(sale)h(terminals,)f
-(manage-)596 3502 y(ment)j(reports,)g(and)h(so)g(on.)g(CORB)m(A)h(w)o
-(ould)f(be)g(the)g(communication)d(medium,)i(managing)f(netw)o(ork)596
-3593 y(traf)n(\002c)d(and)h(most)g(of)g(the)g(security)-5
-b(.)596 3726 y(\(Note:)18 b(Communication)e(between)h(object)h(serv)o
-(ers)g(has)h(not)f(yet)h(been)e(de\002ned,)h(b)n(ut)g(the)h(intention)e
-(is)i(to)596 3817 y(reuse)j(the)h('Database')f(interf)o(ace,)f(so)i
-(that)g(an)g(application)e(doesn')o(t)g(care)i(if)g(data)g(is)g(stored)
-f(directly)g(in)596 3908 y(a)g(GD)m(A)f(enabled)g(database,)g(or)g(on)g
-(another)g(object)g(serv)o(er)-5 b(.)21 b(Security)g(and)g(system)h
-(con\002guration)d(will)596 4000 y(also)h(be)g(issues)h(that)g(need)e
-(to)h(be)g(de)n(v)o(eloped,)e(as)j(well.\))p Black 3641
-5876 a Fb(6)p Black eop
+2414 y(Another)17 b(option)g(is)i(to)g(e)o(xport)e(data)h(from)f(the)i
+(one)f(database)f(and)h(import)g(it)h(to)f(the)h(other)e(database)h
+(\(see)596 2505 y(Batch)i(T)-7 b(ables)20 b(in)h(Module)e(Designers)h
+(Guide\).)596 2638 y(The)f(adv)n(antages)g(are:)p Black
+596 2854 a Fe(\225)p Black 80 w Ff(W)-7 b(e)22 b(can)e(use)g(that)g(e)n
+(v)o(en)g(if)g(not)g(both)f(communication)f(partners)h(use)h(GNUe)p
+Black 596 2987 a Fe(\225)p Black 80 w Ff(W)-7 b(e)22
+b(can)e(do)f(this)i(asynchronously;)c(e)n(v)o(en)i(via)h(streamer)g
+(tape.)p Black 596 3120 a Fe(\225)p Black 80 w Ff(IMO)g(we)h(will)g(ha)
+n(v)o(e)f(less)h(issues)g(with)f(security)-5 b(.)p Black
+596 3253 a Fe(\225)p Black 80 w Ff(Pre)n(v)o(ents)20
+b(customers)f(from)g(ha)n(ving)g(access)i(to)f(my)g(object)g(serv)o(er)
+-5 b(.)596 3385 y(Example)18 b(of)i(a)h(\(relati)n(v)o(ely)e(simple\))g
+(multi)i(serv)o(er)e(system:)596 3518 y(A)g(chain)f(of)g(stores)h(runs)
+f(a)h(single)f(computer)f(in)i(each)f(store)g(to)h(manage)e(that)i
+(store')-5 b(s)19 b(database.)f(Ev)o(en)f(if)596 3610
+y(netw)o(ork)i(links)i(f)o(ail,)g(the)f(LAN)h(in)g(the)g(store)f(will)i
+(still)g(operate)d(correctly)-5 b(.)19 b(A)i(computer)e(at)i(head)f(of)
+n(\002ce)596 3701 y(can)26 b(connect)g(to)g(the)h(store)g(systems)g(at)
+g(appropriate)e(times)i(to)g(retrie)n(v)o(e)e(accounting)g
+(information.)f(A)596 3792 y(store)29 b(manager)e(can)i(tak)o(e)g(a)g
+(laptop)g(with)g(another)e(object)i(serv)o(er)f(home,)g(and)g(use)i
+(this)f(to)g(access)h(a)596 3884 y(database)19 b(-)h(the)h(object)e
+(serv)o(er)g(on)h(the)g(laptop)g(will)g(manage)f(b)n(uf)n(fering)f(of)i
+(data)g(to)g(optimise)g(useage)g(of)596 3975 y(the)k(slo)n(w)h(netw)o
+(ork)f(link.)g(The)h(store)f(computers)f(can)i(access)g(the)g(compan)o
+(y')-5 b(s)23 b(w)o(arehouse)g(to)i(request)596 4066
+y(ne)n(w)g(stock)h(shipments,)f(and)g(the)h(w)o(arehouse)f(can,)g(in)h
+(turn,)f(arrange)g(purcahses)f(of)i(ne)n(w)g(stock)g(from)596
+4158 y(suppliers,)19 b(either)h(automatically)e(or)i(with)h(manual)e
+(appro)o(v)n(al.)596 4290 y(In)31 b(this)h(system,)f(the)h(GNUe)g
+(object)f(serv)o(er)f(will)j(pro)o(vide)c(the)j(data)f(management)e
+(system,)j(F)o(orms)596 4382 y(w)o(ould)19 b(run)h(the)h(user)f(interf)
+o(ace)g(for)g(v)n(arious)f(applications)g(such)i(as)g(point)f(of)g
+(sale)h(terminals,)f(manage-)596 4473 y(ment)j(reports,)g(and)h(so)g
+(on.)g(CORB)m(A)h(w)o(ould)f(be)g(the)g(communication)d(medium,)i
+(managing)f(netw)o(ork)596 4564 y(traf)n(\002c)d(and)h(most)g(of)g(the)
+g(security)-5 b(.)596 4697 y(\(Note:)18 b(Communication)e(between)h
+(object)h(serv)o(ers)g(has)h(not)f(yet)h(been)e(de\002ned,)h(b)n(ut)g
+(the)h(intention)e(is)i(to)596 4789 y(reuse)j(the)h('Database')f
+(interf)o(ace,)f(so)i(that)g(an)g(application)e(doesn')o(t)g(care)i(if)
+g(data)g(is)g(stored)f(directly)g(in)596 4880 y(a)g(GD)m(A)f(enabled)g
+(database,)g(or)g(on)g(another)g(object)g(serv)o(er)-5
+b(.)21 b(Security)g(and)g(system)h(con\002guration)d(will)596
+4971 y(also)h(be)g(issues)h(that)g(need)e(to)h(be)g(de)n(v)o(eloped,)e
+(as)j(well.\))p Black 3641 5876 a Fb(6)p Black eop
%%Page: 7 7
7 6 bop Black Black 197 422 a Fd(Chapter)48 b(4.)g(Business)f(T)-14
b(o)48 b(Business)197 612 y(Operation)596 843 y Ff(Allo)n(wing)24
@@ -2347,10 +2359,21 @@
b(tables)h(promise)f(\003e)o(xibility)h(to)g(translate)h(data)f
(elements)g(between)f(dif)n(ferent)g(domains,)596 5146
y(b)n(ut)20 b(add)f(an)h(additional)f(layer)h(of)g(comple)o(xity)e
-(into)i(situations)g(where)g(the)o(y)f(are)h(not)g(needed.)p
+(into)i(situations)g(where)g(the)o(y)f(are)h(not)g(needed.)596
+5278 y(Further)g(discussion)h(about)g(using)g(seeded)g(numbers)f(asa)j
+(primary)d(k)o(e)o(ys)h(in)h(all)g(tables)g(vs.)g(meaningful)596
+5370 y(data)27 b(primary)e(k)o(e)o(ys)j(needs)e(further)g(real)i(time)f
+(discussion.)g(There)f(are)i(adv)n(antages)d(/)j(disadv)n(antages)p
Black 3601 5876 a Fb(18)p Black eop
%%Page: 19 19
-19 18 bop Black Black 197 422 a Fd(Chapter)48 b(14.)f(Ref)n(erential)h
+19 18 bop Black 2572 -132 a Fb(Chapter)20 b(13.)g(Object)g
+(Relationships)p Black 596 380 a Ff(to)25 b(all)g(that)g(are)g(not)f
+(fully)g(encompassed)g(in)h(this)g(document)e(and)h(much)g(easier)h(to)
+g(relay)f(in)h(real)g(time)596 471 y(discussion.)19 b(From)h(which)f
+(this)i(document)d(can)i(be)g(modi\002ed)f(with)i(results)f(of)g(that)g
+(discussion.)p Black 3601 5876 a Fb(19)p Black eop
+%%Page: 20 20
+20 19 bop Black Black 197 422 a Fd(Chapter)48 b(14.)f(Ref)n(erential)h
(Integrity)596 657 y Ff(This)24 b(is)i(an)e(important)f(aspect)i(of)f
(an)o(y)g(comple)o(x)f(database)h(system.)g(A)h(corrupt)e(database,)h
(caused)g(by)596 748 y(writing)i(erroneous)f(v)n(alues)i(to)g
@@ -2360,9 +2383,9 @@
(requried)f(to)i(enforce)596 931 y(referential)18 b(inte)o(grity)h(at)i
(all)g(times.)596 1063 y(Ho)n(we)n(v)o(er)m(,)d(no)h(decisions)h(ha)n
(v)o(e)g(been)f(made)h(as)h(to)f(serv)o(er)f(code)h(to)g(support)f
-(this.)p Black 3601 5876 a Fb(19)p Black eop
-%%Page: 20 20
-20 19 bop Black Black 197 422 a Fd(Chapter)48 b(15.)f(Data)h(T)-10
+(this.)p Black 3601 5876 a Fb(20)p Black eop
+%%Page: 21 21
+21 20 bop Black Black 197 422 a Fd(Chapter)48 b(15.)f(Data)h(T)-10
b(ypes)596 654 y Ff(A)26 b(range)e(of)i(data)g(types)f(for)g(\002elds)h
(will)h(need)e(to)h(be)f(supported.)f(A)i(number)e(of)i(basic)f
(requirements)596 745 y(e)o(xist,)20 b(b)n(ut)g(no)g(de\002nate)f
@@ -2415,9 +2438,9 @@
(strings.)596 5174 y(option:)c(a)j(32)e(bit)h(v)n(alue)g(can)f(be)h
(used,)g(as)g(in)h(UNIX,)e(and)h(the)g(application)e(has)i(to)g
(translate)g(to)g(an)g(ASCII)596 5265 y(string.)p Black
-3601 5876 a Fb(20)p Black eop
-%%Page: 21 21
-21 20 bop Black 2892 -132 a Fb(Chapter)20 b(15.)g(Data)f(T)-6
+3601 5876 a Fb(21)p Black eop
+%%Page: 22 22
+22 21 bop Black 197 -132 a Fb(Chapter)20 b(15.)f(Data)h(T)-6
b(ypes)p Black 197 401 a Fi(Summar)q(y)596 564 y Ff(string)17
b(-)g(unbounded)d(te)o(xt)k(char\(N\))e(-)i(bounded)d(te)o(xt)i(int)h
(-)f(32)g(bit)h(signed)f(inte)o(ger)f(uint)i(-)f(32)g(bit)h(unsigned)
@@ -2430,10 +2453,10 @@
1104 y(option)e(2:)j(datetime)e(-)i(YYYY)-9 b(-MM-DD)19
b(HH:MM:SS)i(GMT)596 1237 y(option)13 b(3:)j(date)f(-)g(YYYY)-9
b(-MM-DD)14 b(time)i(-)f(HH:MM:SS)h(GMT)f(datetime)g(-)g(YYYY)-9
-b(-MM-DD)15 b(HH:MM:SS)596 1328 y(GMT)p Black 3601 5876
-a Fb(21)p Black eop
-%%Page: 22 22
-22 21 bop Black Black 197 422 a Fd(Chapter)48 b(16.)f(Security)596
+b(-MM-DD)15 b(HH:MM:SS)596 1328 y(GMT)p Black 197 5876
+a Fb(22)p Black eop
+%%Page: 23 23
+23 22 bop Black Black 197 422 a Fd(Chapter)48 b(16.)f(Security)596
654 y Ff(Little)20 b(has)h(been)e(speci\002ed)h(in)g(the)h(w)o(ay)f(of)
g(security)-5 b(,)19 b(b)n(ut)h(some)g(important)e(items)j(are)f
(listed)h(here:)596 787 y(1\))k(Users)i(must)f(authenticate)f(themselv)
@@ -2465,10 +2488,20 @@
(object)596 2099 y(serv)o(er)19 b(is)i(irrele)n(v)n(ant)e(if)h(the)g
(actual)g(database)g(is)h(vulnerable.)596 2231 y(There)h(will)i(need)f
(to)g(be)h(an)f(administration)f(application)g(created)g(to)i(manage)e
-(user)h(rights)g(within)g(the)596 2323 y(system.)p Black
-3601 5876 a Fb(22)p Black eop
-%%Page: 23 23
-23 22 bop Black Black 197 422 a Fd(Appendix)48 b(A.)96
+(user)h(rights)g(within)g(the)596 2323 y(system.)596
+2456 y(Object)i(le)n(v)o(el)g(security)g(needs)g(to)g(be)h(discussed)f
+(and)g(incorporated)d(into)k(this)g(document.)d(I)i(think)g(we)596
+2547 y(will)c(w)o(ant)h(to)f(mo)o(v)o(e)f(a)o(w)o(ay)g(from)g(db)h(le)n
+(v)o(el)g(security)f(only)-5 b(.)20 b(As)i(part)f(of)g(the)g(object)f
+(security)h(discussion)596 2638 y(we)f(may)h(need)e(to)i(touch)f(on)g
+(security)g(\002lter)h(for)f(data.)g(Database)g(security)g(alone)g
+(should)g(be)g(used)g(only)596 2730 y(for)25 b(po)n(wer)f(users)i(who)f
+(could)g(direct)h(access)g(the)g(database)f(without)g(using)g(the)h
+(object)f(serv)o(er)g(or)g(for)596 2821 y(client)20 b(serv)o(er)f
+(applications)g(that)h(dont)g(use)g(object)g(serv)o(er)-5
+b(.)p Black 3601 5876 a Fb(23)p Black eop
+%%Page: 24 24
+24 23 bop Black Black 197 422 a Fd(Appendix)48 b(A.)96
b(GNU)48 b(General)f(Pub)n(lic)h(License)999 644 y Fa(GNU)c(GENERAL)g
(PUBLIC)g(LICENSE)909 726 y(Version)g(2,)g(June)h(1991)640
891 y(Copyright)f(\(C\))g(1989,)g(1991)g(Free)g(Software)g(Foundation,)
@@ -2534,11 +2567,11 @@
596 5083 y(patent)f(must)h(be)h(licensed)e(for)i(everyone's)e(free)h
(use)g(or)h(not)f(licensed)g(at)g(all.)685 5247 y(The)h(precise)e
(terms)h(and)g(conditions)g(for)g(copying,)f(distribution)g(and)596
-5329 y(modification)f(follow.)p Black 3601 5876 a Fb(23)p
+5329 y(modification)f(follow.)p Black 3601 5876 a Fb(24)p
Black eop
-%%Page: 24 24
-24 23 bop Black 197 -132 a Fb(Appendix)18 b(A.)j(GNU)g(Gener)o(al)e
-(Public)h(License)p Black 775 380 a Fa(GNU)44 b(GENERAL)g(PUBLIC)g
+%%Page: 25 25
+25 24 bop Black 2279 -132 a Fb(Appendix)18 b(A.)i(GNU)h(Gener)o(al)f
+(Public)f(License)p Black 775 380 a Fa(GNU)44 b(GENERAL)g(PUBLIC)g
(LICENSE)730 462 y(TERMS)g(AND)g(CONDITIONS)f(FOR)i(COPYING,)e
(DISTRIBUTION)g(AND)h(MODIFICATION)685 626 y(0.)h(This)f(License)f
(applies)h(to)h(any)f(program)g(or)g(other)g(work)g(which)g(contains)
@@ -2617,10 +2650,10 @@
596 5393 y(on)g(the)g(Program,)g(the)g(distribution)f(of)h(the)h(whole)
f(must)g(be)g(on)h(the)f(terms)g(of)596 5476 y(this)g(License,)f(whose)
h(permissions)f(for)h(other)g(licensees)g(extend)g(to)g(the)p
-Black 197 5876 a Fb(24)p Black eop
-%%Page: 25 25
-25 24 bop Black 2279 -132 a Fb(Appendix)18 b(A.)i(GNU)h(Gener)o(al)f
-(Public)f(License)p Black 596 380 a Fa(entire)43 b(whole,)h(and)g(thus)
+Black 3601 5876 a Fb(25)p Black eop
+%%Page: 26 26
+26 25 bop Black 197 -132 a Fb(Appendix)18 b(A.)j(GNU)g(Gener)o(al)e
+(Public)h(License)p Black 596 380 a Fa(entire)43 b(whole,)h(and)g(thus)
h(to)f(each)g(and)h(every)f(part)g(regardless)f(of)h(who)h(wrote)f(it.)
596 544 y(Thus,)g(it)g(is)g(not)h(the)f(intent)g(of)g(this)h(section)e
(to)i(claim)f(rights)g(or)g(contest)596 626 y(your)g(rights)f(to)i
@@ -2696,10 +2729,10 @@
5393 y(prohibited)f(by)h(law)g(if)h(you)f(do)h(not)f(accept)g(this)g
(License.)88 b(Therefore,)44 b(by)596 5476 y(modifying)f(or)h
(distributing)f(the)h(Program)g(\(or)g(any)h(work)f(based)g(on)g(the)p
-Black 3601 5876 a Fb(25)p Black eop
-%%Page: 26 26
-26 25 bop Black 197 -132 a Fb(Appendix)18 b(A.)j(GNU)g(Gener)o(al)e
-(Public)h(License)p Black 596 380 a Fa(Program\),)43
+Black 197 5876 a Fb(26)p Black eop
+%%Page: 27 27
+27 26 bop Black 2279 -132 a Fb(Appendix)18 b(A.)i(GNU)h(Gener)o(al)f
+(Public)f(License)p Black 596 380 a Fa(Program\),)43
b(you)h(indicate)g(your)g(acceptance)f(of)h(this)h(License)e(to)i(do)f
(so,)h(and)596 462 y(all)f(its)g(terms)g(and)g(conditions)g(for)g
(copying,)f(distributing)g(or)i(modifying)596 544 y(the)f(Program)f(or)
@@ -2778,10 +2811,10 @@
(Foundation.)88 b(If)44 b(the)h(Program)e(does)h(not)h(specify)e(a)i
(version)f(number)g(of)596 5476 y(this)g(License,)f(you)h(may)h(choose)
f(any)g(version)g(ever)g(published)f(by)i(the)f(Free)g(Software)p
-Black 197 5876 a Fb(26)p Black eop
-%%Page: 27 27
-27 26 bop Black 2279 -132 a Fb(Appendix)18 b(A.)i(GNU)h(Gener)o(al)f
-(Public)f(License)p Black 596 380 a Fa(Foundation.)685
+Black 3598 5876 a Fb(27)p Black eop
+%%Page: 28 28
+28 27 bop Black 197 -132 a Fb(Appendix)18 b(A.)j(GNU)g(Gener)o(al)e
+(Public)h(License)p Black 596 380 a Fa(Foundation.)685
544 y(10.)45 b(If)f(you)g(wish)g(to)h(incorporate)e(parts)h(of)g(the)h
(Program)e(into)i(other)f(free)596 626 y(programs)f(whose)h
(distribution)f(conditions)g(are)h(different,)f(write)h(to)h(the)f
@@ -2852,10 +2885,10 @@
y(along)g(with)g(this)g(program;)g(if)g(not,)g(write)g(to)h(the)f(Free)
g(Software)775 5393 y(Foundation,)f(Inc.,)h(59)g(Temple)g(Place,)g
(Suite)g(330,)g(Boston,)g(MA)89 b(02111-1307)f(USA)p
-Black 3598 5876 a Fb(27)p Black eop
-%%Page: 28 28
-28 27 bop Black 197 -132 a Fb(Appendix)18 b(A.)j(GNU)g(Gener)o(al)e
-(Public)h(License)p Black 596 462 a Fa(Also)44 b(add)g(information)f
+Black 197 5876 a Fb(28)p Black eop
+%%Page: 29 29
+29 28 bop Black 2279 -132 a Fb(Appendix)18 b(A.)i(GNU)h(Gener)o(al)f
+(Public)f(License)p Black 596 462 a Fa(Also)44 b(add)g(information)f
(on)h(how)h(to)f(contact)g(you)g(by)h(electronic)e(and)h(paper)g(mail.)
596 626 y(If)g(the)g(program)g(is)g(interactive,)f(make)h(it)h(output)f
(a)g(short)g(notice)g(like)g(this)596 708 y(when)g(it)g(starts)g(in)g
@@ -2888,10 +2921,10 @@
(permit)f(linking)f(proprietary)g(applications)g(with)h(the)596
2763 y(library.)88 b(If)44 b(this)g(is)h(what)f(you)g(want)h(to)f(do,)g
(use)h(the)f(GNU)g(Library)g(General)596 2845 y(Public)f(License)h
-(instead)g(of)g(this)g(License.)p Black 197 5876 a Fb(28)p
+(instead)g(of)g(this)g(License.)p Black 3601 5876 a Fb(29)p
Black eop
-%%Page: 29 29
-29 28 bop Black Black 197 422 a Fd(Appendix)48 b(B.)96
+%%Page: 30 30
+30 29 bop Black Black 197 422 a Fd(Appendix)48 b(B.)96
b(GNU)48 b(Free)g(Documentation)197 612 y(License)820
834 y Fa(GNU)c(Free)g(Documentation)f(License)730 916
y(Version)h(1.1,)g(March)g(2000)640 1080 y(Copyright)g(\(C\))g(2000)89
@@ -2954,10 +2987,10 @@
(ethical)h(or)g(political)f(position)h(regarding)596
5272 y(them.)596 5436 y(The)g("Invariant)f(Sections")g(are)i(certain)e
(Secondary)h(Sections)f(whose)h(titles)p Black 3601 5876
-a Fb(29)p Black eop
-%%Page: 30 30
-30 29 bop Black 197 -132 a Fb(Appendix)18 b(B.)j(GNU)g(F)-5
-b(r)m(ee)20 b(Documentation)e(License)p Black 596 380
+a Fb(30)p Black eop
+%%Page: 31 31
+31 30 bop Black 2105 -132 a Fb(Appendix)19 b(B.)h(GNU)h(F)-5
+b(r)m(ee)21 b(Documentation)c(License)p Black 596 380
a Fa(are)44 b(designated,)f(as)h(being)g(those)g(of)h(Invariant)e
(Sections,)g(in)i(the)f(notice)596 462 y(that)g(says)g(that)g(the)g
(Document)g(is)g(released)g(under)g(this)g(License.)596
@@ -3031,10 +3064,10 @@
y(the)g(full)g(title)g(with)g(all)g(words)g(of)h(the)f(title)g(equally)
g(prominent)f(and)596 5476 y(visible.)88 b(You)44 b(may)g(add)h(other)f
(material)f(on)i(the)f(covers)g(in)g(addition.)p Black
-197 5876 a Fb(30)p Black eop
-%%Page: 31 31
-31 30 bop Black 2105 -132 a Fb(Appendix)19 b(B.)h(GNU)h(F)-5
-b(r)m(ee)21 b(Documentation)c(License)p Black 596 380
+3601 5876 a Fb(31)p Black eop
+%%Page: 32 32
+32 31 bop Black 197 -132 a Fb(Appendix)18 b(B.)j(GNU)g(F)-5
+b(r)m(ee)20 b(Documentation)e(License)p Black 596 380
a Fa(Copying)43 b(with)h(changes)g(limited)g(to)g(the)g(covers,)g(as)h
(long)f(as)g(they)g(preserve)596 462 y(the)g(title)g(of)g(the)h
(Document)e(and)h(satisfy)g(these)g(conditions,)f(can)h(be)h(treated)
@@ -3113,11 +3146,11 @@
(Document,)g(create)f(one)730 5393 y(stating)h(the)g(title,)g(year,)g
(authors,)f(and)i(publisher)e(of)h(the)h(Document)e(as)730
5476 y(given)h(on)g(its)h(Title)f(Page,)g(then)g(add)g(an)h(item)f
-(describing)f(the)h(Modified)p Black 3601 5876 a Fb(31)p
+(describing)f(the)h(Modified)p Black 197 5876 a Fb(32)p
Black eop
-%%Page: 32 32
-32 31 bop Black 197 -132 a Fb(Appendix)18 b(B.)j(GNU)g(F)-5
-b(r)m(ee)20 b(Documentation)e(License)p Black 730 380
+%%Page: 33 33
+33 32 bop Black 2105 -132 a Fb(Appendix)19 b(B.)h(GNU)h(F)-5
+b(r)m(ee)21 b(Documentation)c(License)p Black 730 380
a Fa(Version)44 b(as)g(stated)g(in)g(the)h(previous)e(sentence.)596
462 y(J.)h(Preserve)f(the)i(network)e(location,)h(if)g(any,)g(given)g
(in)h(the)f(Document)g(for)730 544 y(public)g(access)g(to)g(a)h
@@ -3194,11 +3227,11 @@
g(each)g(such)g(section)g(unique)g(by)596 5393 y(adding)f(at)i(the)f
(end)g(of)h(it,)f(in)h(parentheses,)e(the)h(name)g(of)h(the)f(original)
596 5476 y(author)f(or)i(publisher)e(of)i(that)f(section)f(if)i(known,)
-f(or)g(else)g(a)h(unique)f(number.)p Black 197 5876 a
-Fb(32)p Black eop
-%%Page: 33 33
-33 32 bop Black 2105 -132 a Fb(Appendix)19 b(B.)h(GNU)h(F)-5
-b(r)m(ee)21 b(Documentation)c(License)p Black 596 380
+f(or)g(else)g(a)h(unique)f(number.)p Black 3601 5876
+a Fb(33)p Black eop
+%%Page: 34 34
+34 33 bop Black 197 -132 a Fb(Appendix)18 b(B.)j(GNU)g(F)-5
+b(r)m(ee)20 b(Documentation)e(License)p Black 596 380
a Fa(Make)44 b(the)g(same)g(adjustment)f(to)i(the)f(section)g(titles)g
(in)g(the)g(list)h(of)596 462 y(Invariant)e(Sections)g(in)i(the)f
(license)g(notice)g(of)g(the)g(combined)g(work.)596 626
@@ -3264,11 +3297,11 @@
b(other)g(attempt)g(to)596 5393 y(copy,)g(modify,)f(sublicense)g(or)i
(distribute)e(the)h(Document)g(is)g(void,)g(and)h(will)596
5476 y(automatically)d(terminate)h(your)i(rights)e(under)h(this)h
-(License.)88 b(However,)p Black 3601 5876 a Fb(33)p Black
+(License.)88 b(However,)p Black 197 5876 a Fb(34)p Black
eop
-%%Page: 34 34
-34 33 bop Black 197 -132 a Fb(Appendix)18 b(B.)j(GNU)g(F)-5
-b(r)m(ee)20 b(Documentation)e(License)p Black 596 380
+%%Page: 35 35
+35 34 bop Black 2105 -132 a Fb(Appendix)19 b(B.)h(GNU)h(F)-5
+b(r)m(ee)21 b(Documentation)c(License)p Black 596 380
a Fa(parties)43 b(who)h(have)h(received)e(copies,)h(or)g(rights,)g
(from)g(you)g(under)g(this)596 462 y(License)f(will)h(not)h(have)f
(their)g(licenses)f(terminated)g(so)i(long)f(as)h(such)596
@@ -3319,9 +3352,9 @@
(examples)g(in)g(parallel)g(under)g(your)g(choice)g(of)596
4160 y(free)g(software)f(license,)h(such)g(as)g(the)h(GNU)f(General)g
(Public)f(License,)596 4243 y(to)h(permit)g(their)g(use)g(in)h(free)f
-(software.)p Black 197 5876 a Fb(34)p Black eop
-%%Page: 35 35
-35 34 bop Black Black Black Black eop
+(software.)p Black 3601 5876 a Fb(35)p Black eop
+%%Page: 36 36
+36 35 bop Black Black Black Black eop
%%Trailer
end
userdict /end-hook known{end-hook}if
Index: gnue/docs/GNUeObjectServer.rtf
diff -u gnue/docs/GNUeObjectServer.rtf:1.1 gnue/docs/GNUeObjectServer.rtf:1.2
--- gnue/docs/GNUeObjectServer.rtf:1.1 Wed Sep 20 23:33:43 2000
+++ gnue/docs/GNUeObjectServer.rtf Sun Oct 1 00:43:03 2000
@@ -5,7 +5,7 @@
}
{\colortbl;}{\stylesheet{\s1 Heading 1;}{\s2 Heading 2;}{\s3 Heading 3;}{\s4
Heading 4;}{\s5 Heading 5;}{\s6 Heading 6;}{\s7 Heading 7;}{\s8 Heading 8;}{\s9
Heading 9;}}
\deflang1024\notabind\facingp\hyphauto1\widowctrl
-\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}\pard\sl20 {\*\bkmkstart ID_INDEX}{\*\bkmkend ID_INDEX}\fs20
\hyphpar0\par\pard\sb373\sl547\qc \b\fs49\f1 GNU Enterprise - Object Server
Guide Proposal\keepn\hyphpar0\par\pard\sl220 \b0\fs20\f0
\~\hyphpar0\par\pard\sb1991\sl380\qc \b\fs34\f1 Andrew
Murie\keepn\hyphpar0\par\pard\sl220\qc \fs24 GNU: Enterprise Core Development
Team\hyphpar0\par\pard\sb1296\sl264\qc Edited
by\keepn\hyphpar0\par\pard\sl380\qc \fs34 Derek
Neighbors\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}\pard\sl20 \fs20 \keepn\hyphpar0\par\pard\sl-240 \b\f1 GNU
Enterprise - Object Server Guide Proposal\hyphpar0\par\pard\sl220 \b0\f0
by\~Andrew Murie\hyphpar0\par\pard\sb220\sl220 by\~\hyphpar0\par\pard\sl220
Edited by\~Derek Neighbors\hyphpar0\par\pard\sb220\sl220 Published Thu Sep 20
12:30:23 MST 2000\hyphpar0\par\pard\sl220 Copyright\~\'a9\~2000 by Free
Software Foundation\hyphpar0\par\pard\sb200\sl220 \fs16 Copyright (c) 2000 Free
Software Foundation\hyphpar0\par\pard\sl220 Permission is granted to copy,
distribute and/or modify this document under the terms of the GNU Free
Documentation License, Version 1.1 or any later version published by the Free
Software Foundation; with no Invariant Sections, with no Front-Cover Texts and
with no Back-Cover Texts. A copy of the license is included in the section
entitled "GNU Free Documentation
License".\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgnlcrm\pgnrestart\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{\i\fs20 \chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 \b\fs41\f1 Table of
Contents\keepn\hyphpar0\par\pard\sb207\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_OVERVIEW}{\fldrslt \fs20\f0 1. Overview}}\fs20\f0
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l ID_OVERVIEW}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_OVERVIEW}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_BIZOBJECTS}{\fldrslt 2. Business
Objects}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_BIZOBJECTS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_BIZOBJECTS}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l _34 }{\fldrslt \b0 Objects}}\b0
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _34 }{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF _34}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _37 }{\fldrslt Fields}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK
\\l _37 }{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _37}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _40 }{\fldrslt Triggers}}\tqr\tldot\tx8400\tab {\field{\*\fldinst
HYPERLINK \\l _40 }{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _40}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _44 }{\fldrslt Methods}}\tqr\tldot\tx8400\tab {\field{\*\fldinst
HYPERLINK \\l _44 }{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _44}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_ARCHITECTURE}{\fldrslt \b 3. System Architecture}}\b
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_ARCHITECTURE}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_ARCHITECTURE}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_BIZOPERATION}{\fldrslt 4. Business To
Business Operation}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_BIZOPERATION}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_BIZOPERATION}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_USAGE}{\fldrslt 5. Application
Usage}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_USAGE}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF ID_USAGE}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_CORBA}{\fldrslt 6. CORBA Notes}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_CORBA}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_CORBA}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_CLASSES}{\fldrslt 7. Classes}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_CLASSES}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_CLASSES}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_CONNECTING}{\fldrslt 8. Connecting}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_CONNECTING}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_CONNECTING}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_PROCESSING}{\fldrslt 9. Processing}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_PROCESSING}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_PROCESSING}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l _86 }{\fldrslt \b0 Creating New Objects}}\b0
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _86 }{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF _86}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _89 }{\fldrslt Locating Arbitrary Objects}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l _89 }{\fldrslt {\field\flddirty{\*\fldinst
PAGEREF _89}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l _94 }{\fldrslt Reading From An
Object}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _94
}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _94}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _99 }{\fldrslt Writing To An Object}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l _99 }{\fldrslt {\field\flddirty{\*\fldinst
PAGEREF _99}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l _104 }{\fldrslt Reference
Fields}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _104
}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _104}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _113 }{\fldrslt Sets of Objects}}\tqr\tldot\tx8400\tab {\field{\*\fldinst
HYPERLINK \\l _113 }{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
_113}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l _121 }{\fldrslt Calling Object Methods}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l _121 }{\fldrslt {\field\flddirty{\*\fldinst
PAGEREF _121}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l _125 }{\fldrslt
Triggers}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _125
}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _125}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _130 }{\fldrslt Transactions}}\tqr\tldot\tx8400\tab {\field{\*\fldinst
HYPERLINK \\l _130 }{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
_130}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l _134 }{\fldrslt Memory Management}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l _134 }{\fldrslt {\field\flddirty{\*\fldinst
PAGEREF _134}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_MODULECREATION}{\fldrslt \b 10. Module
Creation}}\b \tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_MODULECREATION}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_MODULECREATION}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_INSTALLMODULES}{\fldrslt 11. Installing
Modules}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_INSTALLMODULES}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_INSTALLMODULES}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_CUSTOMIZINGMODULES}{\fldrslt 12.
Customizing Modules}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_CUSTOMIZINGMODULES}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_CUSTOMIZINGMODULES}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_OBJRELATIONSHIPS}{\fldrslt 13. Object
Relationships}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_OBJRELATIONSHIPS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_OBJRELATIONSHIPS}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_REFINTEGRITY}{\fldrslt 14. Referential
Integrity}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_REFINTEGRITY}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_REFINTEGRITY}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_DATATYPES}{\fldrslt 15. Data
Types}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_DATATYPES}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_DATATYPES}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l _193 }{\fldrslt \b0 Text}}\b0
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _193 }{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF _193}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _196 }{\fldrslt Numeric}}\tqr\tldot\tx8400\tab {\field{\*\fldinst
HYPERLINK \\l _196 }{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
_196}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l _203 }{\fldrslt Money/Currency}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l _203 }{\fldrslt {\field\flddirty{\*\fldinst
PAGEREF _203}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l _206 }{\fldrslt
Date/Time}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _206
}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _206}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _211 }{\fldrslt Summary}}\tqr\tldot\tx8400\tab {\field{\*\fldinst
HYPERLINK \\l _211 }{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
_211}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_SECURITY}{\fldrslt \b 16. Security}}\b
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l ID_SECURITY}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_SECURITY}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_APPENDIXES}{\fldrslt I. Appendixes}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_APPENDIXES}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_APPENDIXES}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l _227 }{\fldrslt \b0 A. GNU General Public License}}\b0
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _227 }{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF _227}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _230 }{\fldrslt B. GNU Free Documentation License}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l _230 }{\fldrslt {\field\flddirty{\*\fldinst
PAGEREF _230}{\fldrslt
000}}}}\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\pgnrestart\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 1. Overview}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 1.
Overview}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_OVERVIEW}{\*\bkmkend ID_OVERVIEW}\b\fs41\f1 Chapter 1.
Overview\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0 The
object server manages a collection of persistant business objects for an
enterprise. A range of applications will use the object server for data access.
It is being implemented in CORBA to make the objects available to a wide range
of development languages (C, C++, Python, Java, COBOL, Tcl/Tk, and a whole
range of other languages.) \hyphpar0\par\pard\sb100\li960\sl220\qj Note: some
issues have not been decided on, and a number of options exist, trading
simplicity of implementation & configuration against future extensibility.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 2. Business Objects}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 2. Business
Objects}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_BIZOBJECTS}{\*\bkmkend ID_BIZOBJECTS}\b\fs41\f1 Chapter 2. Business
Objects\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0 A
business object is a set of data values (fields) together with a set of
functions that are automatically called when a certain event occurs (triggers)
and another set of functions that can be called from outside the object
(methods). \hyphpar0\par\pard\sb100\li960\sl220\qj The triggers and functions
are designed to enforce business rules that are applicable to an entire
enterprise: all applications will share the same rules.
\hyphpar0\par\pard\sb100\li960\sl220\qj (Implementation note: Names of all
classes, fields, triggers, methods, etc will be case insensitive. On the server
side, they may be stored in whatever case is considered appropriate. Currently,
all tables and columns are using all lower case letters for simplicity, as the
MySQL database is case sensitive. Allowing any of those items to be
distinguished only by case would not be sufficiently useful to be worth the
extra complexity.) \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
_34}{\*\bkmkend _34}\b\fs34\lang1024\f1
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 An
object is a collection of data and code, with the data being stored in a
database. \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _37}{\*\bkmkend
_37}\b\fs34\lang1024\f1 Fields\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 An object has a number of field types: Basic fields -
contain raw data Lookup fields - data looked up from another table References -
entire sets of other objects Calculated - data calculated based on other data
in the database \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _40}{\*\bkmkend
_40}\b\fs34\lang1024\f1 Triggers\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 Code called before and/or after a specified event.
Optionally prevents the event from occuring, according to business rules.
\hyphpar0\par\pard\sb100\li960\sl220\qj For example, a trigger may prevent an
invalid ISBN being inserted into the database, but can not confirm that it is
the correct ISBN for the associated book. \hyphpar0\par\pard\sb259\s2\sl380
{\*\bkmkstart _44}{\*\bkmkend _44}\b\fs34\lang1024\f1
Methods\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 Code
designed to serve a range of purposes. This will be called by client
applications and/or triggers to perform a range of operations. Operations
specific to an application should be part of the application, and operations
required by many parts of an enterprise belong on the object server, where they
can be implemented once, and used in all appropriate applications.
\hyphpar0\par\pard\sb100\li960\sl220\qj An example is a complex tax
calculation, which relies on a number of variables as well as data from the
database.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 3. System Architecture}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 3. System
Architecture}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_ARCHITECTURE}{\*\bkmkend ID_ARCHITECTURE}\b\fs41\f1 Chapter 3. System
Architecture\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0
There are two proposed options, both with advantages and disadvantages.
\hyphpar0\par\pard\sb100\li960\sl220\qj A) Non scalable single server.
\hyphpar0\par\pard\sb100\li960\sl220\qj This arrangement would have a single
SQL database and a single object server providing data to a number of
application programs. The advantage to this is simplicity - it's easy to
configure, and new modules can be installed by copying the files to a
directory, and then just using them. However, this means the entire system is
limited to the capabilites of a single machine. All applications will have to
run on the same LAN, or accept a severe speed penalty. This will be a
significant limit to future growth, and will harm business-to-business
transaction use of GNUe, as that would require multiple servers communication
over variable networks. \hyphpar0\par\pard\sb100\li960\sl220\qj B) Scalable
system with multiple servers. \hyphpar0\par\pard\sb100\li960\sl220\qj A
scalable system will allow as many databases and object servers to be installed
as are required. Each application will connect to the object servers that
provide the required data and have appropriate network locations, and those
servers will be internally configured to access the appropriate databases. The
main disadvantage here is complexity for the server implementation - care is
required to ensure the system remains efficient at high levels of distributed
usage. Installation of new modules will require automated tools that set up
databases and object servers correctly. \hyphpar0\par\pard\sb100\li960\sl220\qj
Example of a (relatively simple) multi server system:
\hyphpar0\par\pard\sb100\li960\sl220\qj A chain of stores runs a single
computer in each store to manage that store's database. Even if network links
fail, the LAN in the store will still operate correctly. A computer at head
office can connect to the store systems at appropriate times to retrieve
accounting information. A store manager can take a laptop with another object
server home, and use this to access a database - the object server on the
laptop will manage buffering of data to optimise useage of the slow network
link. The store computers can access the company's warehouse to request new
stock shipments, and the warehouse can, in turn, arrange purcahses of new stock
from suppliers, either automatically or with manual approval.
\hyphpar0\par\pard\sb100\li960\sl220\qj In this system, the GNUe object server
will provide the data management system, Forms would run the user interface for
various applications such as point of sale terminals, management reports, and
so on. CORBA would be the communication medium, managing network traffic and
most of the security. \hyphpar0\par\pard\sb100\li960\sl220\qj (Note:
Communication between object servers has not yet been defined, but the
intention is to reuse the 'Database' interface, so that an application doesn't
care if data is stored directly in a GDA enabled database, or on another object
server. Security and system configuration will also be issues that need to be
developed, as well.)
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 4. Business To Business Operation}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 4. Business To Business
Operation}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_BIZOPERATION}{\*\bkmkend ID_BIZOPERATION}\b\fs41\f1 Chapter 4. Business To
Business Operation\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj
\b0\fs20\lang1033\f0 Allowing GNUe to serve as a central component in
business-to-business operations will require that object servers can
communicate with each other in a standard, secure, and traceable way.
\hyphpar0\par\pard\sb100\li960\sl220\qj For example, a server may have a
trigger that detects a drop in stock levels. This will create a new purchase
object, and then select the appropriate supplier to transmit it to.
Authentication will allow the transmission to be accepted, and non-repudiation
will enable the supplier to treat the order as a legal contract - the server
owner would not be able to refuse to pay by claiming to have never sent the
order. All transactions would, of course, need to be logged for accounting
purposes. \hyphpar0\par\pard\sb100\li960\sl220\qj (Note: We will need to
investigate ORBit support of CORBAsecurity for some of these features.)
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 5. Application Usage}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 5. Application
Usage}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_USAGE}{\*\bkmkend ID_USAGE}\b\fs41\f1 Chapter 5. Application
Usage\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0 Typical
applications will establish a connection to the server, perform an amount of
processing, and then disconnect again. Automated systems may maintain a
permanent connection, regularly updating the database with status information
that can then be used by other applications. A range of options will be
available.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 6. CORBA Notes}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 6. CORBA
Notes}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_CORBA}{\*\bkmkend ID_CORBA}\b\fs41\f1 Chapter 6. CORBA
Notes\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0 Typical
module developers will not need to know about CORBA. In GNUe Forms, the Forms
code will provide data from 'somewhere' in a format decided by the author of
Forms. (eg, the Python forms will use normal Python datatypes.)
\hyphpar0\par\pard\sb100\li960\sl220\qj Developers of new classes will specify
the GNUe defined data types for each field, and these will be managed behind
the scenes in whatever way suits the object server and Forms code.
\hyphpar0\par\pard\sb100\li960\sl220\qj GNUe specified data types will be
mapped directly to a CORBA data type, and then to an application specific
datatype. When writing a new module, you will only need a table describing the
GNUE datatypes, and how to use them in your chosen language.
\hyphpar0\par\pard\sb100\li960\sl220\qj Developers who write new triggers or
methods will be give templates in all supported languages. A minimal degree of
complexity is inevitable, but this will be kept as simple as possible, and the
templates will cover handling arguments to functions, returning a result,
reading from the database, writing to the database, and handling error
conditions. (Much of this detail has yet to be decided on.)
\hyphpar0\par\pard\sb100\li960\sl220\qj If a new application does not use
Forms, it may need a minimal amount of CORBA code. This is not particularly
complex in languages such as Python, which maps CORBA objects directly to
Python objects. (See the example Python client code for useage of the server
from Python.) \hyphpar0\par\pard\sb100\li960\sl220\qj Object server developers,
however, will need to be able to understand some CORBA in order to understand
how a client side function call is translated to the server side
implementation.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 7. Classes}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 7.
Classes}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_CLASSES}{\*\bkmkend ID_CLASSES}\b\fs41\f1 Chapter 7.
Classes\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0
DatabaseFactory - Manages connections to a database Database - Allow searching
and creating of objects DataObject - Read and write data to/from a specific
object instance
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 8. Connecting}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 8.
Connecting}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_CONNECTING}{\*\bkmkend ID_CONNECTING}\b\fs41\f1 Chapter 8.
Connecting\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0
Connecting \hyphpar0\par\pard\sb100\li960\sl220\qj The application will locate
an instance of the DatabaseFactory class. This is a fixed access point for a
running object server. It will then request a connection by name, and receive
an appropriate Database object. Optionally, the application will be required to
authenticate to the server, although precise details for this have not been
decided. \hyphpar0\par\pard\sb100\li960\sl220\qj Disconnecting
\hyphpar0\par\pard\sb100\li960\sl220\qj The 'disconnect' method of the Database
object is called to disconnect.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 9. Processing}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 9.
Processing}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_PROCESSING}{\*\bkmkend ID_PROCESSING}\b\fs41\f1 Chapter 9.
Processing\keepn\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _86}{\*\bkmkend
_86}\fs34 Creating New Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 The Database object method 'newObject' takes the
classname of the object to create, and returns an appropriate object reference.
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _89}{\*\bkmkend
_89}\b\fs34\lang1024\f1 Locating Arbitrary
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
There are methods in the database object to search for data: loadObject, which
requires the classname, a fieldname, and the value of that field. It returns a
list of objects where the named field has the required value. the loadAll
method loads all objects of the named class. (More complicated searches may be
developed at a later stage.) \hyphpar0\par\pard\sb100\li960\sl220\qj Some
objects contain references to other objects. (eg a Customer object can find a
list of associated Invoice objects.) The DataObject class includes a
'getReference' method which takes the name of the reference, and returns the
list of matching objects. \hyphpar0\par\pard\sb100\li960\sl220\qj
Database.loadObject() : find a set of objects with a simple search
Database.loadAll() : load all instances of a given class Database.newObject() :
create a new business object instance DataObject.getReference() : get a list of
objects related to a known object \hyphpar0\par\pard\sb259\s2\sl380
{\*\bkmkstart _94}{\*\bkmkend _94}\b\fs34\lang1024\f1 Reading From An
Object\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 The
DataObject class method 'getField' retrieves the value of three types of
fields: basic data fields, fields looked up from other tables, and fields
calculated on the basis of basic data fields.
\hyphpar0\par\pard\sb100\li960\sl220\qj The getField method returns the data
as an ASCII string. \hyphpar0\par\pard\sb100\li960\sl220\qj Additionally,
there will be type specific methods, that convert data to an application
specific format. In particular, the datatypes specified for CORBA IDL will be
used. \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _99}{\*\bkmkend
_99}\b\fs34\lang1024\f1 Writing To An
Object\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 The
DataObject class method 'setField' sets a named basic field to a given value. A
'flush' method can be called to indicate that the application is finished with
an object. Even if that is not called, the server will still write the data to
the database at what it considers to be an appropriate time - the flush method
is a hint, rather than a command. \hyphpar0\par\pard\sb100\li960\sl220\qj The
setField method requires the field data to be submitted as an ASCII string.
\hyphpar0\par\pard\sb100\li960\sl220\qj Additionally, there will be type
specific methods, that convert data from an application specific format. In
particular, the datatypes specified for CORBA IDL will be used.
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _104}{\*\bkmkend
_104}\b\fs34\lang1024\f1 Reference
Fields\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 The
'insert' method in the DataObject class is used to add a single object to a
named field. \hyphpar0\par\pard\sb100\li960\sl220\qj eg: customer_obj.insert(
"invoices" , invoice_obj ); \hyphpar0\par\pard\sb100\li960\sl220\qj The
'setReference' field is used to make a single object reference field point to
the given object. \hyphpar0\par\pard\sb100\li960\sl220\qj eg:
invoice_obj.setReference( "customer" , customer_obj );
\hyphpar0\par\pard\sb100\li960\sl220\qj The nature of the reference determins
if both must be called, or only a single call will cause both references to be
made. (TODO: insert detailed examples of this.)
\hyphpar0\par\pard\sb100\li960\sl220\qj (Note: Referential integrity will
require that relationships can be specified precisely, and that the effects of
the 'insert' and 'setReference' methods are clear in all circumstances.)
\hyphpar0\par\pard\sb100\li960\sl220\qj The 'getReference' method will return
either CORBA_OBJECT_NIL (mapped to None, in Python) or the reference to the
first object in the field. If the field contains a list, then the 'next' and
'previous' methods can be used to navigate through the list ob objects.
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _113}{\*\bkmkend
_113}\b\fs34\lang1024\f1 Sets of
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
(Note: sometimes, these have been incorrectly referred to as lists.)
\hyphpar0\par\pard\sb100\li960\sl220\qj Each DataObject instance has a 'next'
and a 'previous' method, which return a reference to the next or previous
object in the list. Once the end has been reached, the methods will return the
NIL object reference (CORBA_OBJECT_NIL, in C, or None in Python.) A list with
only one element will always return NIL for both 'next' and 'previous'.
\hyphpar0\par\pard\sb100\li960\sl220\qj Currently, sets have no precisely
defined order for the next and previous methods. However, using 'next' or
'previous' to navigate from one end of the list to the other is guaranteed to
process each object in the list exactly once.
\hyphpar0\par\pard\sb100\li960\sl220\qj example: (Note: this is pseudo code, to
examine every instance of a given class.)
\hyphpar0\par\pard\sb100\li960\sl220\qj obj = database.loadAll( "classname" );
while obj != None: obj.getField( ... ); obj = obj.next();
\hyphpar0\par\pard\sb100\li960\sl220\qj In C, the programmer must take care of
client side object references to prevent memory leaks. This is done
automatically in Python. \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
_121}{\*\bkmkend _121}\b\fs34\lang1024\f1 Calling Object
Methods\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
Details have yet to be decided. \hyphpar0\par\pard\sb100\li960\sl220\qj
Methods will take at least one implicit argument - that being the object it is
attached to. Additionally, they will be able to take a set of arguments to
operate on. \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _125}{\*\bkmkend
_125}\b\fs34\lang1024\f1 Triggers\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 Triggers are methods that are called by the object server
in response to various events. Each type of trigger has a defined input
arguments and returns a true/false (yes/no, poass/fail) result. For example,
the "BeforeSet" trigger can return "false" if the data is invalid, and may not
be placed in the database. This is used to enforce business rules.
\hyphpar0\par\pard\sb100\li960\sl220\qj Defined triggers: BeforeSet AfterSet
BeforeGet AfterGet \hyphpar0\par\pard\sb100\li960\sl220\qj It's has been
suggested that triggers are needed for each stage of a transaction, but precise
details are yet to be decided. For example, which object should be affected by
a "BeforeCommit" trigger? \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
_130}{\*\bkmkend _130}\b\fs34\lang1024\f1
Transactions\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
Currently, a transaction is begun by calling the 'beginTransaction' method in
the Database objerct, followed by a series of write operations, and then either
'commitTransaction' or 'rollbackTransaction'. This must be supported by the GDA
provider in use - either directly by the database, or simulated in GDA.
\hyphpar0\par\pard\sb100\li960\sl220\qj An application may, of course, have
multiple transaction open on several servers, and either commit or rollback all
transactions. \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _134}{\*\bkmkend
_134}\b\fs34\lang1024\f1 Memory
Management\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
Client side memory management requires language specific code to free object
references. Fortunately, this is handled automatically by the Python CORBA
bindings, and thus is particularly simple. Clients are obliged to call the
appropriate 'release' method, once a given object is no longer required, in
order to assist in server side memory management. Disconnecting from the
database frees all server side memory automatically. (Note: changes to the
server side code will be done at a later stage, for efficiency, but this will
not impact client side code.)
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 10. Module Creation}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 10. Module
Creation}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_MODULECREATION}{\*\bkmkend ID_MODULECREATION}\b\fs41\f1 Chapter 10. Module
Creation\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0 A
full module consists of several parts, but the object server is primarily
concerned with the definitions of business objects.
\hyphpar0\par\pard\sb100\li960\sl220\qj A class is defined by writing a text
file that describes the members of the class. Additional separate files can
extend a class that was defined in another file. Once this is done, a set of
files need to be created that implement methods and triggers for an object.
These are not absolutely required - if no business rules are appropriate, then
no methods will be needed. \hyphpar0\par\pard\sb100\li960\sl220\qj Initially
such code will be written in Python, but there is no convincing reason why
other languages should be forbidden. The
\hyphpar0\par\pard\sb100\li960\sl220\qj A GUI based class editor will be an
important feature at a later stage. This should include appropriate data
modelling tools to automatically design classes to represent the desired data.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 11. Installing Modules}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 11. Installing
Modules}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_INSTALLMODULES}{\*\bkmkend ID_INSTALLMODULES}\b\fs41\f1 Chapter 11.
Installing Modules\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj
\b0\fs20\lang1033\f0 Single object server system:
\hyphpar0\par\pard\sb100\li960\sl220\qj The user will need to locate the data
directory, and copy files to it. Removing a module will require removing the
files, being careful not to remove any files used by another module. (e.g.
removing the 'birthday' module may damage any other modules that depend on that
module being present.) \hyphpar0\par\pard\sb100\li960\sl220\qj (Note: the
installer program based system described below would most likely be useful for
a non-scalable system, as well, but several people have expressed a desire for
a manual system.) \hyphpar0\par\pard\sb100\li960\sl220\qj Multiple object
server system: \hyphpar0\par\pard\sb100\li960\sl220\qj A module, consisting of
a set of class definitions and method code will be spread over a number of
files, and most likely stored in an archive file (eg .tar.gz) An automated
installation manager will process these files to update the entire system.
\hyphpar0\par\pard\sb100\li960\sl220\qj A manual system is theoretically
possible, but would require an arbitrarily large number of systems to be
updated and synchronised, and an installer seems like an obvious requirement.
\hyphpar0\par\pard\sb100\li960\sl220\qj (Note: the 'gnue-get' automatic
installer will also need to be able to determine which system to
install/update/remove the module to, and will need to use password protection
if administration is restricted to particular users.)
\hyphpar0\par\pard\sb100\li960\sl220\qj eg: gnue-get install [options]
module.name This single command will locate the module, download it, and
install it to the system. \hyphpar0\par\pard\sb100\li960\sl220\qj gnue-get
update [options] module.name This will compare the current version of the
module to the latest available, and install the latest version if appropriate.
(Note: if the module is not already installed, it acts as an install.)
\hyphpar0\par\pard\sb100\li960\sl220\qj gnue-get remove [options] module.name
This will determine the parts of a module not in use by other modules, and
remove just those parts of the module. This ensures unneeded modules can be
cleanly removed, without breaking any other modules. (Note: it has been
suggested that data is not deleted when a module is removed. This will ensure
it is still accessible if/when the module is reinstalled. Some database
administration would be needed if such data is also to be removed - but safety
suggests that it should not be too simple to remove data.
\hyphpar0\par\pard\sb100\li960\sl220\qj The options will allow the user to
specify the system to update, and an administration password, in order to
prevent unauthorised users from corrupting the database.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 12. Customizing Modules}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 12. Customizing
Modules}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_CUSTOMIZINGMODULES}{\*\bkmkend ID_CUSTOMIZINGMODULES}\b\fs41\f1 Chapter 12.
Customizing Modules\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj
\b0\fs20\lang1033\f0 Many businesses will want to customise modules - adding
new data to an object, adding or changing triggers to an object, and so on.
Even when the official module is updated, customisations must be maintained.
\hyphpar0\par\pard\sb100\li960\sl220\qj Customisation allows the addition of
fields to a class, creating new relationships, and adding or modifying triggers
and methods to enforce new/different business rules. Fields may not be removed,
because doing so could break other modules that depend on those fields being
present. \hyphpar0\par\pard\sb100\li960\sl220\qj If a class requires
significant changes (for example, a movie theatre and an airline have vastly
different views of customers, in terms of data stored) then a given class may
not be appropriate, and a new class should be written for that business type.
\hyphpar0\par\pard\sb100\li960\sl220\qj Option 1: The module files are edited
directly. When a module is updated, the server has to compare the original file
to the business' customised version, figure out all the changes that were made,
and then edit the incoming files to reflect the customisations. Allowing
developers to choose the language they want to develop a method/trigger in will
make it very difficult to reliably follow changes to code.
\hyphpar0\par\pard\sb100\li960\sl220\qj Option 2: The business creates a
single text file describing the modifications made to all classes in downloaded
modules. (Multiple files are allowed, if desired.) This becomes a new module,
and gets installed to the system normally. Any time it's changed, the update
program is run, as well. \hyphpar0\par\pard\sb100\li960\sl220\qj For example,
adding a new business specific field to a class requires a two line text file,
and a single install command. (One line to select the class to extend, one line
to extend the class, and a close curly brace to end the extension.) After this,
the new field will always be a part of the given object, no matter how many
times the original module is installed, removed, or updated.
\hyphpar0\par\pard\sb100\li960\sl220\qj (If a GUI module editor is designed,
and for non-expert developers this will be very important, the editor will be
able to automatically call the install/update code, as well.)
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 13. Object Relationships}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 13. Object
Relationships}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_OBJRELATIONSHIPS}{\*\bkmkend ID_OBJRELATIONSHIPS}\b\fs41\f1 Chapter 13.
Object Relationships\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj
\b0\fs20\lang1033\f0 Each object can have 'relationship' fields defined. There
are two significant types: \hyphpar0\par\pard\sb100\li960\sl220\qj Lookup
fields: These contain data looked up from another field.
\hyphpar0\par\pard\sb100\li960\sl220\qj e.g.: An Address object contains a
'countrycode' field. A 'country' field can contain the name of the country,
based on a lookup table that converts country codes to country names. The
'country' field would be a read only lookup field.
\hyphpar0\par\pard\sb100\li960\sl220\qj Object references: These contain
either a single object, or a list of objects.
\hyphpar0\par\pard\sb100\li960\sl220\qj e.g.: A customer object contains a
field 'invoices' which contains the list of all invoices relating to that
customer - empty if no invoices exist for that customer object.
\hyphpar0\par\pard\sb100\li960\sl220\qj The Invoice object contains a field
'customer' which is either empty, or contains a reference to the single
customer object set to be the owner of that specific invoice.
\hyphpar0\par\pard\sb100\li960\sl220\qj Both types of reference are created by
specifying the class to search for, and how to find the appropriate object(s).
This is done bny specifying a set of fields in the base object and a set of
fields in the search object. \hyphpar0\par\pard\sb100\li960\sl220\qj E.g.:
\hyphpar0\par\pard\sb100\li960\sl220\qj In the Customer class, a list of
invoices is specified as consisting of all invoices where the 'customerid'
field matches the 'id' field in the customer object that yolu're interested in.
\hyphpar0\par\pard\sb100\li960\sl220\qj list invoices : Invoice( customerid )
= id; \hyphpar0\par\pard\sb100\li960\sl220\qj The 'list' keyword tells the
server to allow multiple objects. If the 'reference' keyword was used, it would
be marked as an error because the search criteria could return multiple
objects. (This distinction is not required, but helps clarify the purpose of
the field, and enable automatic error detection.)
\hyphpar0\par\pard\sb100\li960\sl220\qj Option A: meaningless indexes only
\hyphpar0\par\pard\sb100\li960\sl220\qj In order to, for example, locate the
name of a country based on its two letter abbreviation, you would first look up
the abbreviation in a translation table, and store the index into the class
required. You would then be able to use a relationship to find the country name
based on the index. This requires the translation table to be maintained, along
with the actual useful data. The suggested benefit is that translation tables
make it easier to adjust data in the database - although care will be needed in
order to ensure a database is not corrupted by damaging translation tables.
\hyphpar0\par\pard\sb100\li960\sl220\qj Option B: meaningful indexes only
\hyphpar0\par\pard\sb100\li960\sl220\qj To locate the name of a country, the
object's countrycode would be set to the two letter code, then the relationship
would look up a table to find the name associated with that code. Objects
without a meaningful ID field would require a new field to be managed by the
module developer. \hyphpar0\par\pard\sb100\li960\sl220\qj Option C: mixed
indexes \hyphpar0\par\pard\sb100\li960\sl220\qj The object server can manage a
meaningless index for each object, using it internally for object management,
as well as providing limited access in order for relationships to use this
index. \hyphpar0\par\pard\sb100\li960\sl220\qj Additionally, objects can be
related directly to each other without needing additional translation tables to
be maintained by module developers. \hyphpar0\par\pard\sb100\li960\sl220\qj
Translation tables promise flexibility to translate data elements between
different domains, but add an additional layer of complexity into situations
where they are not needed.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 14. Referential Integrity}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 14. Referential
Integrity}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_REFINTEGRITY}{\*\bkmkend ID_REFINTEGRITY}\b\fs41\f1 Chapter 14. Referential
Integrity\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0
This is an important aspect of any complex database system. A corrupt database,
caused by writing erroneous values to fields, will cause significant problems
no matter how the fields are interpreted by the application. Code to write to
the database will be requried to enforce referential integrity at all times.
\hyphpar0\par\pard\sb100\li960\sl220\qj However, no decisions have been made as
to server code to support this.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 15. Data Types}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 15. Data
Types}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_DATATYPES}{\*\bkmkend ID_DATATYPES}\b\fs41\f1 Chapter 15. Data
Types\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0 A range
of data types for fields will need to be supported. A number of basic
requirements exist, but no definate decisions have been made.
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _193}{\*\bkmkend
_193}\b\fs34\lang1024\f1 Text\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 Arrays of characters are reasonably simple. However,
support for internationalization will be important, and this includes character
sets with more than 1 byte per character, such as unicode.
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _196}{\*\bkmkend
_196}\b\fs34\lang1024\f1 Numeric\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 64 bit integers are problematic, as ORBIT currently only
supports 32 bit integers (This may change, as the CORBA standard now supports
64 bit integers, but for the time being is not guaranteed.)
\hyphpar0\par\pard\sb100\li960\sl220\qj (The unique object id, suggested to be
a 64 bit integer, will be an opaque type, and thus its internal structure and
contents will not be used by any client, but it will be able to be used for
relationships between objects.) \hyphpar0\par\pard\sb100\li960\sl220\qj 32 bit
signed and unsigned integers are useable as is, without any difficulty.
\hyphpar0\par\pard\sb100\li960\sl220\qj A 'bigint' type is another option,
being implemented as an unbounded string of characters. (This will be less
flexible than a regular fixed integer.) \hyphpar0\par\pard\sb100\li960\sl220\qj
floating point values have another problem - not all systems support the same
definition. CORBA specifies 32-bit and 64-bit IEEE floating point numbers, and
provided all systems used respect this standard, there should be no problem.
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _203}{\*\bkmkend
_203}\b\fs34\lang1024\f1
Money/Currency\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 This is another difficult area. Using a 64 bit integer for
money is precise, but requires applications to take care when performing any
caclulations, and extra fields will be needed for fractions of cents (or other
currency unit.) Using floating point values causes problems when transferring
money around, particularly between systems with different architectures, and
different floating point values. It also affects the precision and range of
values that can be represented. \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
_206}{\*\bkmkend _206}\b\fs34\lang1024\f1
Date/Time\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
date : YYYY-MM-DD time : HH:MM:SS GMT datetime: YYYY-MM-DD HH:MM:SS GMT
\hyphpar0\par\pard\sb100\li960\sl220\qj A conversion to/from a machine
datatype (such as UNIX style seconds since/before the epoch) will be required
for time caclulations. Times and dates stored in this format will be stored as
fixed length strings. \hyphpar0\par\pard\sb100\li960\sl220\qj option: a 32 bit
value can be used, as in UNIX, and the application has to translate to an ASCII
string. \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _211}{\*\bkmkend
_211}\b\fs34\lang1024\f1 Summary\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 string - unbounded text char(N) - bounded text int - 32
bit signed integer uint - 32 bit unsigned integer long - 64 bit signed integer
(not guaranteed) ulong - 64 bit unsigned integer (not guaranteed) bigint -
indefinate sized signed integer float - 32 bit IEEE floating point double - 64
bit IEEE floating point\hyphpar0\par\pard\sb100\li960\sl220\qj option 1: date
- 32 bit integer \hyphpar0\par\pard\sb100\li960\sl220\qj option 2: datetime -
YYYY-MM-DD HH:MM:SS GMT \hyphpar0\par\pard\sb100\li960\sl220\qj option 3: date
- YYYY-MM-DD time - HH:MM:SS GMT datetime - YYYY-MM-DD HH:MM:SS GMT
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 16. Security}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 16.
Security}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_SECURITY}{\*\bkmkend ID_SECURITY}\b\fs41\f1 Chapter 16.
Security\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0
Little has been specified in the way of security, but some important items are
listed here: \hyphpar0\par\pard\sb100\li960\sl220\qj 1) Users must authenticate
themselves to the object server. The server can then enforce access rights,
only allowing permitted data to be read and/or written. Administration options
will also be protected in this way. Access rights will include combinations of
read and write access, both to entire tables, and to sets of records within
tables. (For example, a customer may be given read only access to the customer
and invoices tables, but only for items that are associated with that
customer.) Optionally, even field specific access would be useful, allowing the
customer to update personal information at any time, but not to affect the
business' financial records relating to the customer.
\hyphpar0\par\pard\sb100\li960\sl220\qj 2) Connections must be encrypted to
prevent attackers from reading and/or modifying data on the network. (This will
require work with the ORBit developers.)
\hyphpar0\par\pard\sb100\li960\sl220\qj 3) Non repudiation will be required for
business to business transactions, in order to allow a database generated
purchase order to be accepted and acted on.
\hyphpar0\par\pard\sb100\li960\sl220\qj 4) The actual database must be
protected from unauthorised access - protecting the object server is irrelevant
if the actual database is vulnerable. \hyphpar0\par\pard\sb100\li960\sl220\qj
There will need to be an administration application created to manage user
rights within the system.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Appendix A. GNU General Public License}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Appendix A. GNU General Public
License}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_APPENDIXES}{\*\bkmkend ID_APPENDIXES}{\*\bkmkstart _227}{\*\bkmkend
_227}\b\fs41\f1 Appendix A. GNU General Public License
\keepn\hyphpar0\par\pard\sb207\li960\sl198\qj \b0\fs18\f2 GNU
GENERAL PUBLIC LICENSE\sa0\par\fi0\sb0
+\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}\pard\sl20 {\*\bkmkstart ID_INDEX}{\*\bkmkend ID_INDEX}\fs20
\hyphpar0\par\pard\sb373\sl547\qc \b\fs49\f1 GNU Enterprise - Object Server
Guide Proposal\keepn\hyphpar0\par\pard\sl220 \b0\fs20\f0
\~\hyphpar0\par\pard\sb1991\sl380\qc \b\fs34\f1 Andrew
Murie\keepn\hyphpar0\par\pard\sl220\qc \fs24 GNU: Enterprise Core Development
Team\hyphpar0\par\pard\sb1296\sl264\qc Edited
by\keepn\hyphpar0\par\pard\sl380\qc \fs34 Derek
Neighbors\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}\pard\sl20 \fs20 \keepn\hyphpar0\par\pard\sl-240 \b\f1 GNU
Enterprise - Object Server Guide Proposal\hyphpar0\par\pard\sl220 \b0\f0
by\~Andrew Murie\hyphpar0\par\pard\sb220\sl220 by\~\hyphpar0\par\pard\sl220
Edited by\~Derek Neighbors\hyphpar0\par\pard\sb220\sl220 Published Thu Sep 20
12:30:23 MST 2000\hyphpar0\par\pard\sl220 Copyright\~\'a9\~2000 by Free
Software Foundation\hyphpar0\par\pard\sb200\sl220 \fs16 Copyright (c) 2000 Free
Software Foundation\hyphpar0\par\pard\sl220 Permission is granted to copy,
distribute and/or modify this document under the terms of the GNU Free
Documentation License, Version 1.1 or any later version published by the Free
Software Foundation; with no Invariant Sections, with no Front-Cover Texts and
with no Back-Cover Texts. A copy of the license is included in the section
entitled "GNU Free Documentation
License".\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgnlcrm\pgnrestart\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{\i\fs20 \chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 \b\fs41\f1 Table of
Contents\keepn\hyphpar0\par\pard\sb207\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_OVERVIEW}{\fldrslt \fs20\f0 1. Overview}}\fs20\f0
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l ID_OVERVIEW}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_OVERVIEW}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_BIZOBJECTS}{\fldrslt 2. Business
Objects}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_BIZOBJECTS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_BIZOBJECTS}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l _34 }{\fldrslt \b0 Objects}}\b0
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _34 }{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF _34}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _37 }{\fldrslt Fields}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK
\\l _37 }{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _37}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _40 }{\fldrslt Triggers}}\tqr\tldot\tx8400\tab {\field{\*\fldinst
HYPERLINK \\l _40 }{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _40}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _44 }{\fldrslt Methods}}\tqr\tldot\tx8400\tab {\field{\*\fldinst
HYPERLINK \\l _44 }{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _44}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_ARCHITECTURE}{\fldrslt \b 3. System Architecture}}\b
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_ARCHITECTURE}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_ARCHITECTURE}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_BIZOPERATION}{\fldrslt 4. Business To
Business Operation}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_BIZOPERATION}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_BIZOPERATION}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_USAGE}{\fldrslt 5. Application
Usage}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_USAGE}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF ID_USAGE}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_CORBA}{\fldrslt 6. CORBA Notes}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_CORBA}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_CORBA}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_CLASSES}{\fldrslt 7. Classes}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_CLASSES}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_CLASSES}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_CONNECTING}{\fldrslt 8. Connecting}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_CONNECTING}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_CONNECTING}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_PROCESSING}{\fldrslt 9. Processing}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_PROCESSING}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_PROCESSING}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l _97 }{\fldrslt \b0 Creating New Objects}}\b0
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _97 }{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF _97}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _100 }{\fldrslt Locating Arbitrary Objects}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l _100 }{\fldrslt {\field\flddirty{\*\fldinst
PAGEREF _100}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l _105 }{\fldrslt Reading From An
Object}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _105
}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _105}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _110 }{\fldrslt Writing To An Object}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l _110 }{\fldrslt {\field\flddirty{\*\fldinst
PAGEREF _110}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l _115 }{\fldrslt Reference
Fields}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _115
}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _115}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _124 }{\fldrslt Sets of Objects}}\tqr\tldot\tx8400\tab {\field{\*\fldinst
HYPERLINK \\l _124 }{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
_124}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l _132 }{\fldrslt Calling Object Methods}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l _132 }{\fldrslt {\field\flddirty{\*\fldinst
PAGEREF _132}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l _136 }{\fldrslt
Triggers}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _136
}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _136}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _141 }{\fldrslt Transactions}}\tqr\tldot\tx8400\tab {\field{\*\fldinst
HYPERLINK \\l _141 }{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
_141}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l _145 }{\fldrslt Memory Management}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l _145 }{\fldrslt {\field\flddirty{\*\fldinst
PAGEREF _145}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_MODULECREATION}{\fldrslt \b 10. Module
Creation}}\b \tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_MODULECREATION}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_MODULECREATION}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_INSTALLMODULES}{\fldrslt 11. Installing
Modules}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_INSTALLMODULES}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_INSTALLMODULES}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_CUSTOMIZINGMODULES}{\fldrslt 12.
Customizing Modules}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_CUSTOMIZINGMODULES}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_CUSTOMIZINGMODULES}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_OBJRELATIONSHIPS}{\fldrslt 13. Object
Relationships}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_OBJRELATIONSHIPS}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_OBJRELATIONSHIPS}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_REFINTEGRITY}{\fldrslt 14. Referential
Integrity}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_REFINTEGRITY}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_REFINTEGRITY}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_DATATYPES}{\fldrslt 15. Data
Types}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l
ID_DATATYPES}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
ID_DATATYPES}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l _205 }{\fldrslt \b0 Text}}\b0
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _205 }{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF _205}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _208 }{\fldrslt Numeric}}\tqr\tldot\tx8400\tab {\field{\*\fldinst
HYPERLINK \\l _208 }{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
_208}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l _215 }{\fldrslt Money/Currency}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l _215 }{\fldrslt {\field\flddirty{\*\fldinst
PAGEREF _215}{\fldrslt 000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l _218 }{\fldrslt
Date/Time}}\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _218
}{\fldrslt {\field\flddirty{\*\fldinst PAGEREF _218}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _223 }{\fldrslt Summary}}\tqr\tldot\tx8400\tab {\field{\*\fldinst
HYPERLINK \\l _223 }{\fldrslt {\field\flddirty{\*\fldinst PAGEREF
_223}{\fldrslt 000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480
{\field{\*\fldinst HYPERLINK \\l ID_SECURITY}{\fldrslt \b 16. Security}}\b
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l ID_SECURITY}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_SECURITY}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1440\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l ID_APPENDIXES}{\fldrslt I. Appendixes}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l ID_APPENDIXES}{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF ID_APPENDIXES}{\fldrslt
000}}}}\hyphpar0\par\pard\sb48\li1920\sl220\fi-480 {\field{\*\fldinst
HYPERLINK \\l _240 }{\fldrslt \b0 A. GNU General Public License}}\b0
\tqr\tldot\tx8400\tab {\field{\*\fldinst HYPERLINK \\l _240 }{\fldrslt
{\field\flddirty{\*\fldinst PAGEREF _240}{\fldrslt
000}}}}\hyphpar0\par\pard\li1920\sl220\fi-480 {\field{\*\fldinst HYPERLINK
\\l _243 }{\fldrslt B. GNU Free Documentation License}}\tqr\tldot\tx8400\tab
{\field{\*\fldinst HYPERLINK \\l _243 }{\fldrslt {\field\flddirty{\*\fldinst
PAGEREF _243}{\fldrslt
000}}}}\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\pgnrestart\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 1. Overview}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 1.
Overview}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_OVERVIEW}{\*\bkmkend ID_OVERVIEW}\b\fs41\f1 Chapter 1.
Overview\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0 The
object server manages a collection of persistant business objects for an
enterprise. A range of applications will use the object server for data access.
It is being implemented in CORBA to make the objects available to a wide range
of development languages (C, C++, Python, Java, COBOL, Tcl/Tk, and a whole
range of other languages.) \hyphpar0\par\pard\sb100\li960\sl220\qj Note: some
issues have not been decided on, and a number of options exist, trading
simplicity of implementation & configuration against future extensibility.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 2. Business Objects}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 2. Business
Objects}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_BIZOBJECTS}{\*\bkmkend ID_BIZOBJECTS}\b\fs41\f1 Chapter 2. Business
Objects\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0 A
business object is a set of data values (fields) together with a set of
functions that are automatically called when a certain event occurs (triggers)
and another set of functions that can be called from outside the object
(methods). \hyphpar0\par\pard\sb100\li960\sl220\qj The triggers and functions
are designed to enforce business rules that are applicable to an entire
enterprise: all applications will share the same rules.
\hyphpar0\par\pard\sb100\li960\sl220\qj (Implementation note: Names of all
classes, fields, triggers, methods, etc will be case insensitive. On the server
side, they may be stored in whatever case is considered appropriate. Currently,
all tables and columns are using all lower case letters for simplicity, as the
MySQL database is case sensitive. Allowing any of those items to be
distinguished only by case would not be sufficiently useful to be worth the
extra complexity.) \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
_34}{\*\bkmkend _34}\b\fs34\lang1024\f1
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 An
object is a collection of data and code, with the data being stored in a
database. \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _37}{\*\bkmkend
_37}\b\fs34\lang1024\f1 Fields\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 An object has a number of field types: Basic fields -
contain raw data Lookup fields - data looked up from another table References -
entire sets of other objects Calculated - data calculated based on other data
in the database \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _40}{\*\bkmkend
_40}\b\fs34\lang1024\f1 Triggers\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 Code called before and/or after a specified event.
Optionally prevents the event from occuring, according to business rules.
\hyphpar0\par\pard\sb100\li960\sl220\qj For example, a trigger may prevent an
invalid ISBN being inserted into the database, but can not confirm that it is
the correct ISBN for the associated book. \hyphpar0\par\pard\sb259\s2\sl380
{\*\bkmkstart _44}{\*\bkmkend _44}\b\fs34\lang1024\f1
Methods\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 Code
designed to serve a range of purposes. This will be called by client
applications and/or triggers to perform a range of operations. Operations
specific to an application should be part of the application, and operations
required by many parts of an enterprise belong on the object server, where they
can be implemented once, and used in all appropriate applications.
\hyphpar0\par\pard\sb100\li960\sl220\qj An example is a complex tax
calculation, which relies on a number of variables as well as data from the
database.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 3. System Architecture}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 3. System
Architecture}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_ARCHITECTURE}{\*\bkmkend ID_ARCHITECTURE}\b\fs41\f1 Chapter 3. System
Architecture\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0
There are two proposed options, both with advantages and disadvantages.
\hyphpar0\par\pard\sb100\li960\sl220\qj A) Non scalable single server.
\hyphpar0\par\pard\sb100\li960\sl220\qj This arrangement would have a single
SQL database and a single object server providing data to a number of
application programs. The advantage to this is simplicity - it's easy to
configure, and new modules can be installed by copying the files to a
directory, and then just using them. However, this means the entire system is
limited to the capabilites of a single machine. All applications will have to
run on the same LAN, or accept a severe speed penalty. This will be a
significant limit to future growth, and will harm business-to-business
transaction use of GNUe, as that would require multiple servers communication
over variable networks. \hyphpar0\par\pard\sb100\li960\sl220\qj B) Scalable
system with multiple servers. \hyphpar0\par\pard\sb100\li960\sl220\qj A
scalable system will allow as many databases and object servers to be installed
as are required. Each application will connect to the object servers that
provide the required data and have appropriate network locations, and those
servers will be internally configured to access the appropriate databases. The
main disadvantage here is complexity for the server implementation - care is
required to ensure the system remains efficient at high levels of distributed
usage. Installation of new modules will require automated tools that set up
databases and object servers correctly. \hyphpar0\par\pard\sb100\li960\sl220\qj
Another option is to export data from the one database and import it to the
other database (see Batch Tables in Module Designers Guide).
\hyphpar0\par\pard\sb100\li960\sl220\qj The advantages are:
\hyphpar0\par\pard\sb100\li1160\sl220\fi-200\qj \tx1160 \fs16\lang1024 \'95\tab
\fs20 We can use that even if not both communication partners use GNUe
\hyphpar0\par\pard\sb100\li1160\sl220\fi-200\qj \tx1160 \fs16 \'95\tab \fs20
We can do this asynchronously; even via streamer tape.
\hyphpar0\par\pard\sb100\li1160\sl220\fi-200\qj \tx1160 \fs16 \'95\tab \fs20
IMO we will have less issues with security.
\hyphpar0\par\pard\sb100\li1160\sl220\fi-200\qj \tx1160 \fs16 \'95\tab \fs20
Prevents customers from having access to my object server.
\hyphpar0\par\pard\sb100\li960\sl220\qj \lang1033 Example of a (relatively
simple) multi server system: \hyphpar0\par\pard\sb100\li960\sl220\qj A chain
of stores runs a single computer in each store to manage that store's database.
Even if network links fail, the LAN in the store will still operate correctly.
A computer at head office can connect to the store systems at appropriate times
to retrieve accounting information. A store manager can take a laptop with
another object server home, and use this to access a database - the object
server on the laptop will manage buffering of data to optimise useage of the
slow network link. The store computers can access the company's warehouse to
request new stock shipments, and the warehouse can, in turn, arrange purcahses
of new stock from suppliers, either automatically or with manual approval.
\hyphpar0\par\pard\sb100\li960\sl220\qj In this system, the GNUe object server
will provide the data management system, Forms would run the user interface for
various applications such as point of sale terminals, management reports, and
so on. CORBA would be the communication medium, managing network traffic and
most of the security. \hyphpar0\par\pard\sb100\li960\sl220\qj (Note:
Communication between object servers has not yet been defined, but the
intention is to reuse the 'Database' interface, so that an application doesn't
care if data is stored directly in a GDA enabled database, or on another object
server. Security and system configuration will also be issues that need to be
developed, as well.)
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 4. Business To Business Operation}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 4. Business To Business
Operation}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_BIZOPERATION}{\*\bkmkend ID_BIZOPERATION}\b\fs41\f1 Chapter 4. Business To
Business Operation\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj
\b0\fs20\lang1033\f0 Allowing GNUe to serve as a central component in
business-to-business operations will require that object servers can
communicate with each other in a standard, secure, and traceable way.
\hyphpar0\par\pard\sb100\li960\sl220\qj For example, a server may have a
trigger that detects a drop in stock levels. This will create a new purchase
object, and then select the appropriate supplier to transmit it to.
Authentication will allow the transmission to be accepted, and non-repudiation
will enable the supplier to treat the order as a legal contract - the server
owner would not be able to refuse to pay by claiming to have never sent the
order. All transactions would, of course, need to be logged for accounting
purposes. \hyphpar0\par\pard\sb100\li960\sl220\qj (Note: We will need to
investigate ORBit support of CORBAsecurity for some of these features.)
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 5. Application Usage}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 5. Application
Usage}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_USAGE}{\*\bkmkend ID_USAGE}\b\fs41\f1 Chapter 5. Application
Usage\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0 Typical
applications will establish a connection to the server, perform an amount of
processing, and then disconnect again. Automated systems may maintain a
permanent connection, regularly updating the database with status information
that can then be used by other applications. A range of options will be
available.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 6. CORBA Notes}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 6. CORBA
Notes}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_CORBA}{\*\bkmkend ID_CORBA}\b\fs41\f1 Chapter 6. CORBA
Notes\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0 Typical
module developers will not need to know about CORBA. In GNUe Forms, the Forms
code will provide data from 'somewhere' in a format decided by the author of
Forms. (eg, the Python forms will use normal Python datatypes.)
\hyphpar0\par\pard\sb100\li960\sl220\qj Developers of new classes will specify
the GNUe defined data types for each field, and these will be managed behind
the scenes in whatever way suits the object server and Forms code.
\hyphpar0\par\pard\sb100\li960\sl220\qj GNUe specified data types will be
mapped directly to a CORBA data type, and then to an application specific
datatype. When writing a new module, you will only need a table describing the
GNUE datatypes, and how to use them in your chosen language.
\hyphpar0\par\pard\sb100\li960\sl220\qj Developers who write new triggers or
methods will be give templates in all supported languages. A minimal degree of
complexity is inevitable, but this will be kept as simple as possible, and the
templates will cover handling arguments to functions, returning a result,
reading from the database, writing to the database, and handling error
conditions. (Much of this detail has yet to be decided on.)
\hyphpar0\par\pard\sb100\li960\sl220\qj If a new application does not use
Forms, it may need a minimal amount of CORBA code. This is not particularly
complex in languages such as Python, which maps CORBA objects directly to
Python objects. (See the example Python client code for useage of the server
from Python.) \hyphpar0\par\pard\sb100\li960\sl220\qj Object server developers,
however, will need to be able to understand some CORBA in order to understand
how a client side function call is translated to the server side
implementation.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 7. Classes}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 7.
Classes}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_CLASSES}{\*\bkmkend ID_CLASSES}\b\fs41\f1 Chapter 7.
Classes\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0
DatabaseFactory - Manages connections to a database Database - Allow searching
and creating of objects DataObject - Read and write data to/from a specific
object instance
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 8. Connecting}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 8.
Connecting}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_CONNECTING}{\*\bkmkend ID_CONNECTING}\b\fs41\f1 Chapter 8.
Connecting\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0
Connecting \hyphpar0\par\pard\sb100\li960\sl220\qj The application will locate
an instance of the DatabaseFactory class. This is a fixed access point for a
running object server. It will then request a connection by name, and receive
an appropriate Database object. Optionally, the application will be required to
authenticate to the server, although precise details for this have not been
decided. \hyphpar0\par\pard\sb100\li960\sl220\qj Disconnecting
\hyphpar0\par\pard\sb100\li960\sl220\qj The 'disconnect' method of the Database
object is called to disconnect.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 9. Processing}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 9.
Processing}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_PROCESSING}{\*\bkmkend ID_PROCESSING}\b\fs41\f1 Chapter 9.
Processing\keepn\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _97}{\*\bkmkend
_97}\fs34 Creating New Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 The Database object method 'newObject' takes the
classname of the object to create, and returns an appropriate object reference.
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _100}{\*\bkmkend
_100}\b\fs34\lang1024\f1 Locating Arbitrary
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
There are methods in the database object to search for data: loadObject, which
requires the classname, a fieldname, and the value of that field. It returns a
list of objects where the named field has the required value. the loadAll
method loads all objects of the named class. (More complicated searches may be
developed at a later stage.) \hyphpar0\par\pard\sb100\li960\sl220\qj Some
objects contain references to other objects. (eg a Customer object can find a
list of associated Invoice objects.) The DataObject class includes a
'getReference' method which takes the name of the reference, and returns the
list of matching objects. \hyphpar0\par\pard\sb100\li960\sl220\qj
Database.loadObject() : find a set of objects with a simple search
Database.loadAll() : load all instances of a given class Database.newObject() :
create a new business object instance DataObject.getReference() : get a list of
objects related to a known object \hyphpar0\par\pard\sb259\s2\sl380
{\*\bkmkstart _105}{\*\bkmkend _105}\b\fs34\lang1024\f1 Reading From An
Object\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 The
DataObject class method 'getField' retrieves the value of three types of
fields: basic data fields, fields looked up from other tables, and fields
calculated on the basis of basic data fields.
\hyphpar0\par\pard\sb100\li960\sl220\qj The getField method returns the data
as an ASCII string. \hyphpar0\par\pard\sb100\li960\sl220\qj Additionally,
there will be type specific methods, that convert data to an application
specific format. In particular, the datatypes specified for CORBA IDL will be
used. \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _110}{\*\bkmkend
_110}\b\fs34\lang1024\f1 Writing To An
Object\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 The
DataObject class method 'setField' sets a named basic field to a given value. A
'flush' method can be called to indicate that the application is finished with
an object. Even if that is not called, the server will still write the data to
the database at what it considers to be an appropriate time - the flush method
is a hint, rather than a command. \hyphpar0\par\pard\sb100\li960\sl220\qj The
setField method requires the field data to be submitted as an ASCII string.
\hyphpar0\par\pard\sb100\li960\sl220\qj Additionally, there will be type
specific methods, that convert data from an application specific format. In
particular, the datatypes specified for CORBA IDL will be used.
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _115}{\*\bkmkend
_115}\b\fs34\lang1024\f1 Reference
Fields\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0 The
'insert' method in the DataObject class is used to add a single object to a
named field. \hyphpar0\par\pard\sb100\li960\sl220\qj eg: customer_obj.insert(
"invoices" , invoice_obj ); \hyphpar0\par\pard\sb100\li960\sl220\qj The
'setReference' field is used to make a single object reference field point to
the given object. \hyphpar0\par\pard\sb100\li960\sl220\qj eg:
invoice_obj.setReference( "customer" , customer_obj );
\hyphpar0\par\pard\sb100\li960\sl220\qj The nature of the reference determins
if both must be called, or only a single call will cause both references to be
made. (TODO: insert detailed examples of this.)
\hyphpar0\par\pard\sb100\li960\sl220\qj (Note: Referential integrity will
require that relationships can be specified precisely, and that the effects of
the 'insert' and 'setReference' methods are clear in all circumstances.)
\hyphpar0\par\pard\sb100\li960\sl220\qj The 'getReference' method will return
either CORBA_OBJECT_NIL (mapped to None, in Python) or the reference to the
first object in the field. If the field contains a list, then the 'next' and
'previous' methods can be used to navigate through the list ob objects.
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _124}{\*\bkmkend
_124}\b\fs34\lang1024\f1 Sets of
Objects\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
(Note: sometimes, these have been incorrectly referred to as lists.)
\hyphpar0\par\pard\sb100\li960\sl220\qj Each DataObject instance has a 'next'
and a 'previous' method, which return a reference to the next or previous
object in the list. Once the end has been reached, the methods will return the
NIL object reference (CORBA_OBJECT_NIL, in C, or None in Python.) A list with
only one element will always return NIL for both 'next' and 'previous'.
\hyphpar0\par\pard\sb100\li960\sl220\qj Currently, sets have no precisely
defined order for the next and previous methods. However, using 'next' or
'previous' to navigate from one end of the list to the other is guaranteed to
process each object in the list exactly once.
\hyphpar0\par\pard\sb100\li960\sl220\qj example: (Note: this is pseudo code, to
examine every instance of a given class.)
\hyphpar0\par\pard\sb100\li960\sl220\qj obj = database.loadAll( "classname" );
while obj != None: obj.getField( ... ); obj = obj.next();
\hyphpar0\par\pard\sb100\li960\sl220\qj In C, the programmer must take care of
client side object references to prevent memory leaks. This is done
automatically in Python. \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
_132}{\*\bkmkend _132}\b\fs34\lang1024\f1 Calling Object
Methods\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
Details have yet to be decided. \hyphpar0\par\pard\sb100\li960\sl220\qj
Methods will take at least one implicit argument - that being the object it is
attached to. Additionally, they will be able to take a set of arguments to
operate on. \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _136}{\*\bkmkend
_136}\b\fs34\lang1024\f1 Triggers\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 Triggers are methods that are called by the object server
in response to various events. Each type of trigger has a defined input
arguments and returns a true/false (yes/no, poass/fail) result. For example,
the "BeforeSet" trigger can return "false" if the data is invalid, and may not
be placed in the database. This is used to enforce business rules.
\hyphpar0\par\pard\sb100\li960\sl220\qj Defined triggers: BeforeSet AfterSet
BeforeGet AfterGet \hyphpar0\par\pard\sb100\li960\sl220\qj It's has been
suggested that triggers are needed for each stage of a transaction, but precise
details are yet to be decided. For example, which object should be affected by
a "BeforeCommit" trigger? \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
_141}{\*\bkmkend _141}\b\fs34\lang1024\f1
Transactions\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
Currently, a transaction is begun by calling the 'beginTransaction' method in
the Database objerct, followed by a series of write operations, and then either
'commitTransaction' or 'rollbackTransaction'. This must be supported by the GDA
provider in use - either directly by the database, or simulated in GDA.
\hyphpar0\par\pard\sb100\li960\sl220\qj An application may, of course, have
multiple transaction open on several servers, and either commit or rollback all
transactions. \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _145}{\*\bkmkend
_145}\b\fs34\lang1024\f1 Memory
Management\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
Client side memory management requires language specific code to free object
references. Fortunately, this is handled automatically by the Python CORBA
bindings, and thus is particularly simple. Clients are obliged to call the
appropriate 'release' method, once a given object is no longer required, in
order to assist in server side memory management. Disconnecting from the
database frees all server side memory automatically. (Note: changes to the
server side code will be done at a later stage, for efficiency, but this will
not impact client side code.)
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 10. Module Creation}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 10. Module
Creation}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_MODULECREATION}{\*\bkmkend ID_MODULECREATION}\b\fs41\f1 Chapter 10. Module
Creation\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0 A
full module consists of several parts, but the object server is primarily
concerned with the definitions of business objects.
\hyphpar0\par\pard\sb100\li960\sl220\qj A class is defined by writing a text
file that describes the members of the class. Additional separate files can
extend a class that was defined in another file. Once this is done, a set of
files need to be created that implement methods and triggers for an object.
These are not absolutely required - if no business rules are appropriate, then
no methods will be needed. \hyphpar0\par\pard\sb100\li960\sl220\qj Initially
such code will be written in Python, but there is no convincing reason why
other languages should be forbidden. The
\hyphpar0\par\pard\sb100\li960\sl220\qj A GUI based class editor will be an
important feature at a later stage. This should include appropriate data
modelling tools to automatically design classes to represent the desired data.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 11. Installing Modules}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 11. Installing
Modules}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_INSTALLMODULES}{\*\bkmkend ID_INSTALLMODULES}\b\fs41\f1 Chapter 11.
Installing Modules\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj
\b0\fs20\lang1033\f0 Single object server system:
\hyphpar0\par\pard\sb100\li960\sl220\qj The user will need to locate the data
directory, and copy files to it. Removing a module will require removing the
files, being careful not to remove any files used by another module. (e.g.
removing the 'birthday' module may damage any other modules that depend on that
module being present.) \hyphpar0\par\pard\sb100\li960\sl220\qj (Note: the
installer program based system described below would most likely be useful for
a non-scalable system, as well, but several people have expressed a desire for
a manual system.) \hyphpar0\par\pard\sb100\li960\sl220\qj Multiple object
server system: \hyphpar0\par\pard\sb100\li960\sl220\qj A module, consisting of
a set of class definitions and method code will be spread over a number of
files, and most likely stored in an archive file (eg .tar.gz) An automated
installation manager will process these files to update the entire system.
\hyphpar0\par\pard\sb100\li960\sl220\qj A manual system is theoretically
possible, but would require an arbitrarily large number of systems to be
updated and synchronised, and an installer seems like an obvious requirement.
\hyphpar0\par\pard\sb100\li960\sl220\qj (Note: the 'gnue-get' automatic
installer will also need to be able to determine which system to
install/update/remove the module to, and will need to use password protection
if administration is restricted to particular users.)
\hyphpar0\par\pard\sb100\li960\sl220\qj eg: gnue-get install [options]
module.name This single command will locate the module, download it, and
install it to the system. \hyphpar0\par\pard\sb100\li960\sl220\qj gnue-get
update [options] module.name This will compare the current version of the
module to the latest available, and install the latest version if appropriate.
(Note: if the module is not already installed, it acts as an install.)
\hyphpar0\par\pard\sb100\li960\sl220\qj gnue-get remove [options] module.name
This will determine the parts of a module not in use by other modules, and
remove just those parts of the module. This ensures unneeded modules can be
cleanly removed, without breaking any other modules. (Note: it has been
suggested that data is not deleted when a module is removed. This will ensure
it is still accessible if/when the module is reinstalled. Some database
administration would be needed if such data is also to be removed - but safety
suggests that it should not be too simple to remove data.
\hyphpar0\par\pard\sb100\li960\sl220\qj The options will allow the user to
specify the system to update, and an administration password, in order to
prevent unauthorised users from corrupting the database.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 12. Customizing Modules}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 12. Customizing
Modules}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_CUSTOMIZINGMODULES}{\*\bkmkend ID_CUSTOMIZINGMODULES}\b\fs41\f1 Chapter 12.
Customizing Modules\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj
\b0\fs20\lang1033\f0 Many businesses will want to customise modules - adding
new data to an object, adding or changing triggers to an object, and so on.
Even when the official module is updated, customisations must be maintained.
\hyphpar0\par\pard\sb100\li960\sl220\qj Customisation allows the addition of
fields to a class, creating new relationships, and adding or modifying triggers
and methods to enforce new/different business rules. Fields may not be removed,
because doing so could break other modules that depend on those fields being
present. \hyphpar0\par\pard\sb100\li960\sl220\qj If a class requires
significant changes (for example, a movie theatre and an airline have vastly
different views of customers, in terms of data stored) then a given class may
not be appropriate, and a new class should be written for that business type.
\hyphpar0\par\pard\sb100\li960\sl220\qj Option 1: The module files are edited
directly. When a module is updated, the server has to compare the original file
to the business' customised version, figure out all the changes that were made,
and then edit the incoming files to reflect the customisations. Allowing
developers to choose the language they want to develop a method/trigger in will
make it very difficult to reliably follow changes to code.
\hyphpar0\par\pard\sb100\li960\sl220\qj Option 2: The business creates a
single text file describing the modifications made to all classes in downloaded
modules. (Multiple files are allowed, if desired.) This becomes a new module,
and gets installed to the system normally. Any time it's changed, the update
program is run, as well. \hyphpar0\par\pard\sb100\li960\sl220\qj For example,
adding a new business specific field to a class requires a two line text file,
and a single install command. (One line to select the class to extend, one line
to extend the class, and a close curly brace to end the extension.) After this,
the new field will always be a part of the given object, no matter how many
times the original module is installed, removed, or updated.
\hyphpar0\par\pard\sb100\li960\sl220\qj (If a GUI module editor is designed,
and for non-expert developers this will be very important, the editor will be
able to automatically call the install/update code, as well.)
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 13. Object Relationships}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 13. Object
Relationships}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_OBJRELATIONSHIPS}{\*\bkmkend ID_OBJRELATIONSHIPS}\b\fs41\f1 Chapter 13.
Object Relationships\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj
\b0\fs20\lang1033\f0 Each object can have 'relationship' fields defined. There
are two significant types: \hyphpar0\par\pard\sb100\li960\sl220\qj Lookup
fields: These contain data looked up from another field.
\hyphpar0\par\pard\sb100\li960\sl220\qj e.g.: An Address object contains a
'countrycode' field. A 'country' field can contain the name of the country,
based on a lookup table that converts country codes to country names. The
'country' field would be a read only lookup field.
\hyphpar0\par\pard\sb100\li960\sl220\qj Object references: These contain
either a single object, or a list of objects.
\hyphpar0\par\pard\sb100\li960\sl220\qj e.g.: A customer object contains a
field 'invoices' which contains the list of all invoices relating to that
customer - empty if no invoices exist for that customer object.
\hyphpar0\par\pard\sb100\li960\sl220\qj The Invoice object contains a field
'customer' which is either empty, or contains a reference to the single
customer object set to be the owner of that specific invoice.
\hyphpar0\par\pard\sb100\li960\sl220\qj Both types of reference are created by
specifying the class to search for, and how to find the appropriate object(s).
This is done bny specifying a set of fields in the base object and a set of
fields in the search object. \hyphpar0\par\pard\sb100\li960\sl220\qj E.g.:
\hyphpar0\par\pard\sb100\li960\sl220\qj In the Customer class, a list of
invoices is specified as consisting of all invoices where the 'customerid'
field matches the 'id' field in the customer object that yolu're interested in.
\hyphpar0\par\pard\sb100\li960\sl220\qj list invoices : Invoice( customerid )
= id; \hyphpar0\par\pard\sb100\li960\sl220\qj The 'list' keyword tells the
server to allow multiple objects. If the 'reference' keyword was used, it would
be marked as an error because the search criteria could return multiple
objects. (This distinction is not required, but helps clarify the purpose of
the field, and enable automatic error detection.)
\hyphpar0\par\pard\sb100\li960\sl220\qj Option A: meaningless indexes only
\hyphpar0\par\pard\sb100\li960\sl220\qj In order to, for example, locate the
name of a country based on its two letter abbreviation, you would first look up
the abbreviation in a translation table, and store the index into the class
required. You would then be able to use a relationship to find the country name
based on the index. This requires the translation table to be maintained, along
with the actual useful data. The suggested benefit is that translation tables
make it easier to adjust data in the database - although care will be needed in
order to ensure a database is not corrupted by damaging translation tables.
\hyphpar0\par\pard\sb100\li960\sl220\qj Option B: meaningful indexes only
\hyphpar0\par\pard\sb100\li960\sl220\qj To locate the name of a country, the
object's countrycode would be set to the two letter code, then the relationship
would look up a table to find the name associated with that code. Objects
without a meaningful ID field would require a new field to be managed by the
module developer. \hyphpar0\par\pard\sb100\li960\sl220\qj Option C: mixed
indexes \hyphpar0\par\pard\sb100\li960\sl220\qj The object server can manage a
meaningless index for each object, using it internally for object management,
as well as providing limited access in order for relationships to use this
index. \hyphpar0\par\pard\sb100\li960\sl220\qj Additionally, objects can be
related directly to each other without needing additional translation tables to
be maintained by module developers. \hyphpar0\par\pard\sb100\li960\sl220\qj
Translation tables promise flexibility to translate data elements between
different domains, but add an additional layer of complexity into situations
where they are not needed. \hyphpar0\par\pard\sb100\li960\sl220\qj Further
discussion about using seeded numbers asa primary keys in all tables vs.
meaningful data primary keys needs further real time discussion. There are
advantages / disadvantages to all that are not fully encompassed in this
document and much easier to relay in real time discussion. From which this
document can be modified with results of that discussion.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 14. Referential Integrity}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 14. Referential
Integrity}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_REFINTEGRITY}{\*\bkmkend ID_REFINTEGRITY}\b\fs41\f1 Chapter 14. Referential
Integrity\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0
This is an important aspect of any complex database system. A corrupt database,
caused by writing erroneous values to fields, will cause significant problems
no matter how the fields are interpreted by the application. Code to write to
the database will be requried to enforce referential integrity at all times.
\hyphpar0\par\pard\sb100\li960\sl220\qj However, no decisions have been made as
to server code to support this.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 15. Data Types}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 15. Data
Types}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_DATATYPES}{\*\bkmkend ID_DATATYPES}\b\fs41\f1 Chapter 15. Data
Types\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0 A range
of data types for fields will need to be supported. A number of basic
requirements exist, but no definate decisions have been made.
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _205}{\*\bkmkend
_205}\b\fs34\lang1024\f1 Text\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 Arrays of characters are reasonably simple. However,
support for internationalization will be important, and this includes character
sets with more than 1 byte per character, such as unicode.
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _208}{\*\bkmkend
_208}\b\fs34\lang1024\f1 Numeric\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 64 bit integers are problematic, as ORBIT currently only
supports 32 bit integers (This may change, as the CORBA standard now supports
64 bit integers, but for the time being is not guaranteed.)
\hyphpar0\par\pard\sb100\li960\sl220\qj (The unique object id, suggested to be
a 64 bit integer, will be an opaque type, and thus its internal structure and
contents will not be used by any client, but it will be able to be used for
relationships between objects.) \hyphpar0\par\pard\sb100\li960\sl220\qj 32 bit
signed and unsigned integers are useable as is, without any difficulty.
\hyphpar0\par\pard\sb100\li960\sl220\qj A 'bigint' type is another option,
being implemented as an unbounded string of characters. (This will be less
flexible than a regular fixed integer.) \hyphpar0\par\pard\sb100\li960\sl220\qj
floating point values have another problem - not all systems support the same
definition. CORBA specifies 32-bit and 64-bit IEEE floating point numbers, and
provided all systems used respect this standard, there should be no problem.
\hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _215}{\*\bkmkend
_215}\b\fs34\lang1024\f1
Money/Currency\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 This is another difficult area. Using a 64 bit integer for
money is precise, but requires applications to take care when performing any
caclulations, and extra fields will be needed for fractions of cents (or other
currency unit.) Using floating point values causes problems when transferring
money around, particularly between systems with different architectures, and
different floating point values. It also affects the precision and range of
values that can be represented. \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart
_218}{\*\bkmkend _218}\b\fs34\lang1024\f1
Date/Time\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj \b0\fs20\lang1033\f0
date : YYYY-MM-DD time : HH:MM:SS GMT datetime: YYYY-MM-DD HH:MM:SS GMT
\hyphpar0\par\pard\sb100\li960\sl220\qj A conversion to/from a machine
datatype (such as UNIX style seconds since/before the epoch) will be required
for time caclulations. Times and dates stored in this format will be stored as
fixed length strings. \hyphpar0\par\pard\sb100\li960\sl220\qj option: a 32 bit
value can be used, as in UNIX, and the application has to translate to an ASCII
string. \hyphpar0\par\pard\sb259\s2\sl380 {\*\bkmkstart _223}{\*\bkmkend
_223}\b\fs34\lang1024\f1 Summary\keepn\hyphpar0\par\pard\sb173\li960\sl220\qj
\b0\fs20\lang1033\f0 string - unbounded text char(N) - bounded text int - 32
bit signed integer uint - 32 bit unsigned integer long - 64 bit signed integer
(not guaranteed) ulong - 64 bit unsigned integer (not guaranteed) bigint -
indefinate sized signed integer float - 32 bit IEEE floating point double - 64
bit IEEE floating point\hyphpar0\par\pard\sb100\li960\sl220\qj option 1: date
- 32 bit integer \hyphpar0\par\pard\sb100\li960\sl220\qj option 2: datetime -
YYYY-MM-DD HH:MM:SS GMT \hyphpar0\par\pard\sb100\li960\sl220\qj option 3: date
- YYYY-MM-DD time - HH:MM:SS GMT datetime - YYYY-MM-DD HH:MM:SS GMT
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Chapter 16. Security}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Chapter 16.
Security}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_SECURITY}{\*\bkmkend ID_SECURITY}\b\fs41\f1 Chapter 16.
Security\keepn\hyphpar0\par\pard\sb207\li960\sl220\qj \b0\fs20\lang1033\f0
Little has been specified in the way of security, but some important items are
listed here: \hyphpar0\par\pard\sb100\li960\sl220\qj 1) Users must authenticate
themselves to the object server. The server can then enforce access rights,
only allowing permitted data to be read and/or written. Administration options
will also be protected in this way. Access rights will include combinations of
read and write access, both to entire tables, and to sets of records within
tables. (For example, a customer may be given read only access to the customer
and invoices tables, but only for items that are associated with that
customer.) Optionally, even field specific access would be useful, allowing the
customer to update personal information at any time, but not to affect the
business' financial records relating to the customer.
\hyphpar0\par\pard\sb100\li960\sl220\qj 2) Connections must be encrypted to
prevent attackers from reading and/or modifying data on the network. (This will
require work with the ORBit developers.)
\hyphpar0\par\pard\sb100\li960\sl220\qj 3) Non repudiation will be required for
business to business transactions, in order to allow a database generated
purchase order to be accepted and acted on.
\hyphpar0\par\pard\sb100\li960\sl220\qj 4) The actual database must be
protected from unauthorised access - protecting the object server is irrelevant
if the actual database is vulnerable. \hyphpar0\par\pard\sb100\li960\sl220\qj
There will need to be an administration application created to manage user
rights within the system. \hyphpar0\par\pard\sb100\li960\sl220\qj Object level
security needs to be discussed and incorporated into this document. I think we
will want to move away from db level security only. As part of the object
security discussion we may need to touch on security filter for data. Database
security alone should be used only for power users who could direct access the
database without using the object server or for client server applications that
dont use object server.
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Appendix A. GNU General Public License}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Appendix A. GNU General Public
License}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
ID_APPENDIXES}{\*\bkmkend ID_APPENDIXES}{\*\bkmkstart _240}{\*\bkmkend
_240}\b\fs41\f1 Appendix A. GNU General Public License
\keepn\hyphpar0\par\pard\sb207\li960\sl198\qj \b0\fs18\f2
GNU GENERAL PUBLIC LICENSE\sa0\par\fi0\sb0
Version 2, June 1991\sa0\par\fi0\sb0
\sa0\par\fi0\sb0
Copyright (C) 1989, 1991 Free Software Foundation, Inc.\sa0\par\fi0\sb0
@@ -346,7 +346,7 @@
library. If this is what you want to do, use the GNU Library
General\sa0\par\fi0\sb0
Public License instead of this License.\sa0\par\fi0\sb0
\sa0\par\fi0\sb0
-
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Appendix B. GNU Free Documentation License}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Appendix B. GNU Free Documentation
License}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
_230}{\*\bkmkend _230}\b\fs41\f1 Appendix B. GNU Free Documentation License
\keepn\hyphpar0\par\pard\sb207\li960\sl198\qj \b0\fs18\f2 GNU
Free Documentation License\sa0\par\fi0\sb0
+
\hyphpar0\par\sect\sectd\plain\pgwsxn12240\pghsxn15840\marglsxn1920\margrsxn1920\margtsxn960\margbsxn480\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab
{}\par}{\footerf\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 \chpgn
}\par}{\headerl\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
Appendix B. GNU Free Documentation License}\tab {}\tab
{}\par}{\footerl\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400 {\i\fs20
\chpgn }\tab {}\tab
{}\par}{\headerr\pard\sl-240\sb770\sa-50\plain\tqc\tx4200\tqr\tx8400 {}\tab
{}\tab {\i\fs20 Appendix B. GNU Free Documentation
License}\par}{\footerr\pard\sl-240\sb-670\sa910\plain\tqc\tx4200\tqr\tx8400
{}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb311\s1\sl456 {\*\bkmkstart
_243}{\*\bkmkend _243}\b\fs41\f1 Appendix B. GNU Free Documentation License
\keepn\hyphpar0\par\pard\sb207\li960\sl198\qj \b0\fs18\f2 GNU
Free Documentation License\sa0\par\fi0\sb0
Version 1.1, March 2000\sa0\par\fi0\sb0
\sa0\par\fi0\sb0
Copyright (C) 2000 Free Software Foundation, Inc.\sa0\par\fi0\sb0
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnue/docs GDAQuickHackersGuide.pdf GDAQuickHack...,
Derek Neighbors <=