'},_create:function(){this._tabify(true)},_setOption:function(c,d){if(c=="selected"){if(this.options.collapsible&&d==this.options.selected){return}this.select(d)}else{this.options[c]=d;this._tabify()}},_tabId:function(c){return c.title&&c.title.replace(/\s/g,"_").replace(/[^A-Za-z0-9\-_:\.]/g,"")||this.options.idPrefix+(++a)},_sanitizeSelector:function(c){return c.replace(/:/g,"\\:")},_cookie:function(){var c=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+b.data(this.list[0]));return b.cookie.apply(null,[c].concat(b.makeArray(arguments)))},_ui:function(d,c){return{tab:d,panel:c,index:this.anchors.index(d)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var c=b(this);c.html(c.data("label.tabs")).removeData("label.tabs")})},_tabify:function(p){this.list=this.element.find("ol,ul").eq(0);this.lis=b("li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return b("a",this)[0]});this.panels=b([]);var q=this,e=this.options;var d=/^#.+/;this.anchors.each(function(s,o){var r=b(o).attr("href");var u=r.split("#")[0],v;if(u&&(u===location.toString().split("#")[0]||(v=b("base")[0])&&u===v.href)){r=o.hash;o.href=r}if(d.test(r)){q.panels=q.panels.add(q._sanitizeSelector(r))}else{if(r!="#"){b.data(o,"href.tabs",r);b.data(o,"load.tabs",r.replace(/#.*$/,""));var x=q._tabId(o);o.href="#"+x;var w=b("#"+x);if(!w.length){w=b(e.panelTemplate).attr("id",x).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(q.panels[s-1]||q.list);w.data("destroy.tabs",true)}q.panels=q.panels.add(w)}else{e.disabled.push(s)}}});if(p){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all");this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(e.selected===undefined){if(location.hash){this.anchors.each(function(r,o){if(o.hash==location.hash){e.selected=r;return false}})}if(typeof e.selected!="number"&&e.cookie){e.selected=parseInt(q._cookie(),10)}if(typeof e.selected!="number"&&this.lis.filter(".ui-tabs-selected").length){e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))}e.selected=e.selected||this.lis.length?0:-1}else{if(e.selected===null){e.selected=-1}}e.selected=((e.selected>=0&&this.anchors[e.selected])||e.selected<0)?e.selected:0;e.disabled=b.unique(e.disabled.concat(b.map(this.lis.filter(".ui-state-disabled"),function(r,o){return q.lis.index(r)}))).sort();if(b.inArray(e.selected,e.disabled)!=-1){e.disabled.splice(b.inArray(e.selected,e.disabled),1)}this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active");if(e.selected>=0&&this.anchors.length){this.panels.eq(e.selected).removeClass("ui-tabs-hide");this.lis.eq(e.selected).addClass("ui-tabs-selected ui-state-active");q.element.queue("tabs",function(){q._trigger("show",null,q._ui(q.anchors[e.selected],q.panels[e.selected]))});this.load(e.selected)}b(window).bind("unload",function(){q.lis.add(q.anchors).unbind(".tabs");q.lis=q.anchors=q.panels=null})}else{e.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"))}this.element[e.collapsible?"addClass":"removeClass"]("ui-tabs-collapsible");if(e.cookie){this._cookie(e.selected,e.cookie)}for(var h=0,n;(n=this.lis[h]);h++){b(n)[b.inArray(h,e.disabled)!=-1&&!b(n).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled")}if(e.cache===false){this.anchors.removeData("cache.tabs")}this.lis.add(this.anchors).unbind(".tabs");if(e.event!="mouseover"){var g=function(o,i){if(i.is(":not(.ui-state-disabled)")){i.addClass("ui-state-"+o)}};var k=function(o,i){i.removeClass("ui-state-"+o)};this.lis.bind("mouseover.tabs",function(){g("hover",b(this))});this.lis.bind("mouseout.tabs",function(){k("hover",b(this))});this.anchors.bind("focus.tabs",function(){g("focus",b(this).closest("li"))});this.anchors.bind("blur.tabs",function(){k("focus",b(this).closest("li"))})}var c,j;if(e.fx){if(b.isArray(e.fx)){c=e.fx[0];j=e.fx[1]}else{c=j=e.fx}}function f(i,o){i.css({display:""});if(!b.support.opacity&&o.opacity){i[0].style.removeAttribute("filter")}}var l=j?function(i,o){b(i).closest("li").addClass("ui-tabs-selected ui-state-active");o.hide().removeClass("ui-tabs-hide").animate(j,j.duration||"normal",function(){f(o,j);q._trigger("show",null,q._ui(i,o[0]))})}:function(i,o){b(i).closest("li").addClass("ui-tabs-selected ui-state-active");o.removeClass("ui-tabs-hide");q._trigger("show",null,q._ui(i,o[0]))};var m=c?function(o,i){i.animate(c,c.duration||"normal",function(){q.lis.removeClass("ui-tabs-selected ui-state-active");i.addClass("ui-tabs-hide");f(i,c);q.element.dequeue("tabs")})}:function(o,i,r){q.lis.removeClass("ui-tabs-selected ui-state-active");i.addClass("ui-tabs-hide");q.element.dequeue("tabs")};this.anchors.bind(e.event+".tabs",function(){var o=this,s=b(this).closest("li"),i=q.panels.filter(":not(.ui-tabs-hide)"),r=b(q._sanitizeSelector(this.hash));if((s.hasClass("ui-tabs-selected")&&!e.collapsible)||s.hasClass("ui-state-disabled")||s.hasClass("ui-state-processing")||q._trigger("select",null,q._ui(this,r[0]))===false){this.blur();return false}e.selected=q.anchors.index(this);q.abort();if(e.collapsible){if(s.hasClass("ui-tabs-selected")){e.selected=-1;if(e.cookie){q._cookie(e.selected,e.cookie)}q.element.queue("tabs",function(){m(o,i)}).dequeue("tabs");this.blur();return false}else{if(!i.length){if(e.cookie){q._cookie(e.selected,e.cookie)}q.element.queue("tabs",function(){l(o,r)});q.load(q.anchors.index(this));this.blur();return false}}}if(e.cookie){q._cookie(e.selected,e.cookie)}if(r.length){if(i.length){q.element.queue("tabs",function(){m(o,i)})}q.element.queue("tabs",function(){l(o,r)});q.load(q.anchors.index(this))}else{throw"jQuery UI Tabs: Mismatching fragment identifier."}if(b.browser.msie){this.blur()}});this.anchors.bind("click.tabs",function(){return false})},destroy:function(){var c=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var d=b.data(this,"href.tabs");if(d){this.href=d}var e=b(this).unbind(".tabs");b.each(["href","load","cache"],function(f,g){e.removeData(g+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){if(b.data(this,"destroy.tabs")){b(this).remove()}else{b(this).removeClass(["ui-state-default","ui-corner-top","ui-tabs-selected","ui-state-active","ui-state-hover","ui-state-focus","ui-state-disabled","ui-tabs-panel","ui-widget-content","ui-corner-bottom","ui-tabs-hide"].join(" "))}});if(c.cookie){this._cookie(null,c.cookie)}return this},add:function(f,e,d){if(d===undefined){d=this.anchors.length}var c=this,h=this.options,j=b(h.tabTemplate.replace(/#\{href\}/g,f).replace(/#\{label\}/g,e)),i=!f.indexOf("#")?f.replace("#",""):this._tabId(b("a",j)[0]);j.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var g=b("#"+i);if(!g.length){g=b(h.panelTemplate).attr("id",i).data("destroy.tabs",true)}g.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(d>=this.lis.length){j.appendTo(this.list);g.appendTo(this.list[0].parentNode)}else{j.insertBefore(this.lis[d]);g.insertBefore(this.panels[d])}h.disabled=b.map(h.disabled,function(l,k){return l>=d?++l:l});this._tabify();if(this.anchors.length==1){h.selected=0;j.addClass("ui-tabs-selected ui-state-active");g.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[d],this.panels[d]));return this},remove:function(c){var e=this.options,f=this.lis.eq(c).remove(),d=this.panels.eq(c).remove();if(f.hasClass("ui-tabs-selected")&&this.anchors.length>1){this.select(c+(c+1=c?--h:h});this._tabify();this._trigger("remove",null,this._ui(f.find("a")[0],d[0]));return this},enable:function(c){var d=this.options;if(b.inArray(c,d.disabled)==-1){return}this.lis.eq(c).removeClass("ui-state-disabled");d.disabled=b.grep(d.disabled,function(f,e){return f!=c});this._trigger("enable",null,this._ui(this.anchors[c],this.panels[c]));return this},disable:function(d){var c=this,e=this.options;if(d!=e.selected){this.lis.eq(d).addClass("ui-state-disabled");e.disabled.push(d);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[d],this.panels[d]))}return this},select:function(c){if(typeof c=="string"){c=this.anchors.index(this.anchors.filter("[href$="+c+"]"))}else{if(c===null){c=-1}}if(c==-1&&this.options.collapsible){c=this.options.selected}this.anchors.eq(c).trigger(this.options.event+".tabs");return this},load:function(f){var d=this,h=this.options,c=this.anchors.eq(f)[0],e=b.data(c,"load.tabs");this.abort();if(!e||this.element.queue("tabs").length!==0&&b.data(c,"cache.tabs")){this.element.dequeue("tabs");return}this.lis.eq(f).addClass("ui-state-processing");if(h.spinner){var g=b("span",c);g.data("label.tabs",g.html()).html(h.spinner)}this.xhr=b.ajax(b.extend({},h.ajaxOptions,{url:e,success:function(j,i){b(d._sanitizeSelector(c.hash)).html(j);d._cleanup();if(h.cache){b.data(c,"cache.tabs",true)}d._trigger("load",null,d._ui(d.anchors[f],d.panels[f]));try{h.ajaxOptions.success(j,i)}catch(k){}d.element.dequeue("tabs")}}));return this},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},url:function(d,c){this.anchors.eq(d).removeData("cache.tabs").data("load.tabs",c);return this},length:function(){return this.anchors.length}});b.extend(b.ui.tabs,{version:"1.8rc1"});b.extend(b.ui.tabs.prototype,{rotation:null,rotate:function(e,g){var c=this,h=this.options;var d=c._rotate||(c._rotate=function(i){clearTimeout(c.rotation);c.rotation=setTimeout(function(){var j=h.selected;c.select(++j").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0});k.wrap(m);if(k.css("position")=="static"){m.css({position:"relative"});k.css({position:"relative"})}else{g.extend(l,{position:k.css("position"),zIndex:k.css("z-index")});g.each(["top","left","bottom","right"],function(n,o){l[o]=k.css(o);if(isNaN(parseInt(l[o],10))){l[o]="auto"}});k.css({position:"relative",top:0,left:0})}return m.css(l).show()},removeWrapper:function(k){if(k.parent().is(".ui-effects-wrapper")){return k.parent().replaceWith(k)}return k},setTransition:function(l,n,k,m){m=m||{};g.each(n,function(p,o){unit=l.cssUnit(o);if(unit[0]>0){m[o]=unit[0]*k+unit[1]}});return m}});function d(l,k,m,n){if(typeof l=="object"){n=k;m=null;k=l;l=k.effect}if(g.isFunction(k)){n=k;m=null;k={}}if(typeof k=="number"){n=m;m=k;k={}}k=k||{};m=m||k.duration;m=g.fx.off?0:typeof m=="number"?m:g.fx.speeds[m]||g.fx.speeds._default;n=n||k.complete;return[l,k,m,n]}g.fn.extend({effect:function(n,m,p,q){var l=d.apply(this,arguments),o={options:l[1],duration:l[2],callback:l[3]},k=g.effects[n];return k&&!g.fx.off?k.call(this,o):this},_show:g.fn.show,show:function(l){if(!l||typeof l=="number"||g.fx.speeds[l]){return this._show.apply(this,arguments)}else{var k=d.apply(this,arguments);k[1].mode="show";return this.effect.apply(this,k)}},_hide:g.fn.hide,hide:function(l){if(!l||typeof l=="number"||g.fx.speeds[l]){return this._hide.apply(this,arguments)}else{var k=d.apply(this,arguments);k[1].mode="hide";return this.effect.apply(this,k)}},__toggle:g.fn.toggle,toggle:function(l){if(!l||typeof l=="number"||g.fx.speeds[l]||typeof l=="boolean"||g.isFunction(l)){return this.__toggle.apply(this,arguments)}else{var k=d.apply(this,arguments);k[1].mode="toggle";return this.effect.apply(this,k)}},cssUnit:function(k){var l=this.css(k),m=[];g.each(["em","px","%","pt"],function(n,o){if(l.indexOf(o)>0){m=[parseFloat(l),o]}});return m}});g.easing.jswing=g.easing.swing;g.extend(g.easing,{def:"easeOutQuad",swing:function(l,m,k,o,n){return g.easing[g.easing.def](l,m,k,o,n)},easeInQuad:function(l,m,k,o,n){return o*(m/=n)*m+k},easeOutQuad:function(l,m,k,o,n){return -o*(m/=n)*(m-2)+k},easeInOutQuad:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m+k}return -o/2*((--m)*(m-2)-1)+k},easeInCubic:function(l,m,k,o,n){return o*(m/=n)*m*m+k},easeOutCubic:function(l,m,k,o,n){return o*((m=m/n-1)*m*m+1)+k},easeInOutCubic:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m*m+k}return o/2*((m-=2)*m*m+2)+k},easeInQuart:function(l,m,k,o,n){return o*(m/=n)*m*m*m+k},easeOutQuart:function(l,m,k,o,n){return -o*((m=m/n-1)*m*m*m-1)+k},easeInOutQuart:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m*m*m+k}return -o/2*((m-=2)*m*m*m-2)+k},easeInQuint:function(l,m,k,o,n){return o*(m/=n)*m*m*m*m+k},easeOutQuint:function(l,m,k,o,n){return o*((m=m/n-1)*m*m*m*m+1)+k},easeInOutQuint:function(l,m,k,o,n){if((m/=n/2)<1){return o/2*m*m*m*m*m+k}return o/2*((m-=2)*m*m*m*m+2)+k},easeInSine:function(l,m,k,o,n){return -o*Math.cos(m/n*(Math.PI/2))+o+k},easeOutSine:function(l,m,k,o,n){return o*Math.sin(m/n*(Math.PI/2))+k},easeInOutSine:function(l,m,k,o,n){return -o/2*(Math.cos(Math.PI*m/n)-1)+k},easeInExpo:function(l,m,k,o,n){return(m==0)?k:o*Math.pow(2,10*(m/n-1))+k},easeOutExpo:function(l,m,k,o,n){return(m==n)?k+o:o*(-Math.pow(2,-10*m/n)+1)+k},easeInOutExpo:function(l,m,k,o,n){if(m==0){return k}if(m==n){return k+o}if((m/=n/2)<1){return o/2*Math.pow(2,10*(m-1))+k}return o/2*(-Math.pow(2,-10*--m)+2)+k},easeInCirc:function(l,m,k,o,n){return -o*(Math.sqrt(1-(m/=n)*m)-1)+k},easeOutCirc:function(l,m,k,o,n){return o*Math.sqrt(1-(m=m/n-1)*m)+k},easeInOutCirc:function(l,m,k,o,n){if((m/=n/2)<1){return -o/2*(Math.sqrt(1-m*m)-1)+k}return o/2*(Math.sqrt(1-(m-=2)*m)+1)+k},easeInElastic:function(l,n,k,u,r){var o=1.70158;var q=0;var m=u;if(n==0){return k}if((n/=r)==1){return k+u}if(!q){q=r*0.3}if(m0){var f=a(this[0]);var g=f.data("tests");return a.map(f.data("buffer"),function(l,m){return g[m]?l:null}).join("")}d=a.extend({placeholder:"_",completed:null},d);var k=a.mask.definitions;var g=[];var e=j.length;var i=null;var h=j.length;a.each(j.split(""),function(m,l){if(l=="?"){h--;e=m}else{if(k[l]){g.push(new RegExp(k[l]));if(i==null){i=g.length-1}}else{g.push(null)}}});return this.each(function(){var r=a(this);var m=a.map(j.split(""),function(x,y){if(x!="?"){return k[x]?d.placeholder:x}});var n=false;var q=r.val();r.data("buffer",m).data("tests",g);function v(x){while(++x<=h&&!g[x]){}return x}function t(x){while(!g[x]&&--x>=0){}for(var y=x;y16&&z<32)||(z>32&&z<41));if((x.begin-x.end)!=0&&(!n||z==8||z==46)){w(x.begin,x.end)}if(z==8||z==46||(b&&z==127)){t(x.begin+(z==46?0:-1));return false}else{if(z==27){r.val(q);r.caret(0,p());return false}}}function o(B){if(n){n=false;return(B.keyCode==8)?false:null}B=B||window.event;var C=B.charCode||B.keyCode||B.which;var z=a(this).caret();if(B.ctrlKey||B.altKey||B.metaKey){return true}else{if((C>=32&&C<=125)||C>186){var x=v(z.begin-1);if(xz.length){break}}else{if(m[B]==z[x]&&B!=e){x++;C=B}}}if(!y&&C+1=e){s();if(!y){r.val(r.val().substring(0,C+1))}}}return(e?B:i)}if(!r.attr("readonly")){r.one("unmask",function(){r.unbind(".mask").removeData("buffer").removeData("tests")}).bind("focus.mask",function(){q=r.val();var x=p();s();setTimeout(function(){if(x==j.length){r.caret(0,x)}else{r.caret(x)}},0)}).bind("blur.mask",function(){p();if(r.val()!=q){r.change()}}).bind("keydown.mask",l).bind("keypress.mask",o).bind(c,function(){setTimeout(function(){r.caret(p(true))},0)})}p()})}})})(jQuery);
\ No newline at end of file
diff --git a/restrict/modules/ZendModels/data/structure/project_name/public/styles/jquery.treeview.css b/restrict/modules/ZendModels/data/structure/project_name/public/styles/jquery.treeview.css
index 8ea64f5..cd572d2 100644
--- a/restrict/modules/ZendModels/data/structure/project_name/public/styles/jquery.treeview.css
+++ b/restrict/modules/ZendModels/data/structure/project_name/public/styles/jquery.treeview.css
@@ -1,68 +1,68 @@
-.treeview, .treeview ul {
- padding: 0;
- margin: 0;
+.treeview, .treeview ul {
+ padding: 0;
+ margin: 0;
list-style: none;
}
.treeview ul {
background-color: white;
margin-top: 4px;
-}
-
-.treeview .hitarea {
- background: url(../images/treeview-default.gif) -64px -25px no-repeat;
- height: 16px;
- width: 16px;
- margin-left: -16px;
- float: left;
- cursor: pointer;
-}
-/* fix for IE6 */
-* html .hitarea {
- display: inline;
+}
+
+.treeview .hitarea {
+ background: url(../images/treeview-default.gif) -64px -25px no-repeat;
+ height: 16px;
+ width: 16px;
+ margin-left: -16px;
+ float: left;
+ cursor: pointer;
+}
+/* fix for IE6 */
+* html .hitarea {
+ display: inline;
float:none;
-}
-
-.treeview li {
- margin: 0;
- padding: 3px 0pt 3px 16px;
-}
-
-.treeview a.selected {
- background-color: #eee;
-}
-
-#treecontrol { margin: 1em 0; display: none; }
-
-.treeview .hover { color: red; cursor: pointer; }
-
-.treeview li { background: url(../images/treeview-default-line.gif) 0 0 no-repeat; }
-.treeview li.collapsable, .treeview li.expandable { background-position: 0 -176px; }
-
-.treeview .expandable-hitarea { background-position: -80px -3px; }
-
-.treeview li.last { background-position: 0 -1766px }
+}
+
+.treeview li {
+ margin: 0;
+ padding: 3px 0pt 3px 16px;
+}
+
+.treeview a.selected {
+ background-color: #eee;
+}
+
+#treecontrol { margin: 1em 0; display: none; }
+
+.treeview .hover { color: red; cursor: pointer; }
+
+.treeview li { background: url(../images/treeview-default-line.gif) 0 0 no-repeat; }
+.treeview li.collapsable, .treeview li.expandable { background-position: 0 -176px; }
+
+.treeview .expandable-hitarea { background-position: -80px -3px; }
+
+.treeview li.last { background-position: 0 -1766px }
.treeview li.lastCollapsable, .treeview li.lastExpandable { background-image: url(../images/treeview-default.gif); }
.treeview li.lastCollapsable { background-position: 0 -111px }
-.treeview li.lastExpandable { background-position: -32px -67px }
-
+.treeview li.lastExpandable { background-position: -32px -67px }
+
.treeview div.lastCollapsable-hitarea, .treeview div.lastExpandable-hitarea { background-position: 0; }
-
-.treeview-red li { background-image: url(../images/treeview-red-line.gif); }
-.treeview-red .hitarea, .treeview-red li.lastCollapsable, .treeview-red li.lastExpandable { background-image: url(../images/treeview-red.gif); }
-
-.treeview-black li { background-image: url(../images/treeview-black-line.gif); }
-.treeview-black .hitarea, .treeview-black li.lastCollapsable, .treeview-black li.lastExpandable { background-image: url(../images/treeview-black.gif); }
-
-.treeview-gray li { background-image: url(../images/treeview-gray-line.gif); }
-.treeview-gray .hitarea, .treeview-gray li.lastCollapsable, .treeview-gray li.lastExpandable { background-image: url(../images/treeview-gray.gif); }
-
-.treeview-famfamfam li { background-image: url(../images/treeview-famfamfam-line.gif); }
-.treeview-famfamfam .hitarea, .treeview-famfamfam li.lastCollapsable, .treeview-famfamfam li.lastExpandable { background-image: url(../images/treeview-famfamfam.gif); }
-
-
-.filetree li { padding: 3px 0 2px 16px; }
-.filetree span.folder, .filetree span.file { padding: 1px 0 1px 16px; display: block; }
-.filetree span.folder { background: url(../images/folder.gif) 0 0 no-repeat; }
-.filetree li.expandable span.folder { background: url(../images/folder-closed.gif) 0 0 no-repeat; }
-.filetree span.file { background: url(../images/file.gif) 0 0 no-repeat; }
+
+.treeview-red li { background-image: url(../images/treeview-red-line.gif); }
+.treeview-red .hitarea, .treeview-red li.lastCollapsable, .treeview-red li.lastExpandable { background-image: url(../images/treeview-red.gif); }
+
+.treeview-black li { background-image: url(../images/treeview-black-line.gif); }
+.treeview-black .hitarea, .treeview-black li.lastCollapsable, .treeview-black li.lastExpandable { background-image: url(../images/treeview-black.gif); }
+
+.treeview-gray li { background-image: url(../images/treeview-gray-line.gif); }
+.treeview-gray .hitarea, .treeview-gray li.lastCollapsable, .treeview-gray li.lastExpandable { background-image: url(../images/treeview-gray.gif); }
+
+.treeview-famfamfam li { background-image: url(../images/treeview-famfamfam-line.gif); }
+.treeview-famfamfam .hitarea, .treeview-famfamfam li.lastCollapsable, .treeview-famfamfam li.lastExpandable { background-image: url(../images/treeview-famfamfam.gif); }
+
+
+.filetree li { padding: 3px 0 2px 16px; }
+.filetree span.folder, .filetree span.file { padding: 1px 0 1px 16px; display: block; }
+.filetree span.folder { background: url(../images/folder.gif) 0 0 no-repeat; }
+.filetree li.expandable span.folder { background: url(../images/folder-closed.gif) 0 0 no-repeat; }
+.filetree span.file { background: url(../images/file.gif) 0 0 no-repeat; }
diff --git a/restrict/modules/ZendModels/data/structure/project_name/public/styles/zend.generic.css b/restrict/modules/ZendModels/data/structure/project_name/public/styles/zend.generic.css
index 71ee91e..3a67c70 100644
--- a/restrict/modules/ZendModels/data/structure/project_name/public/styles/zend.generic.css
+++ b/restrict/modules/ZendModels/data/structure/project_name/public/styles/zend.generic.css
@@ -1,44 +1,44 @@
-
-body{
-font-family:"frutiger linotype","lucida grande",helvetica,arial,sans-serif;
-color:#333;
-font-size: 76%;
-}
-
-
-#container{
- font-family:arial;
- font-size:18px;
- float:left;
- text-align:left;
-}
-
-#header{
- margin-top:15px;
- height:50px;
- font-size:22px;
- border-bottom:1px solid black;
- text-align:center;
-
-}
-
-.menu{
- float:left;
- padding:12px;
- width:150px;
- height:100%;
-}
-
-#content{
-clear:both;
-background-color: #ffffff;
-color: #333;
-}
-
-#footer{
-border:1px solid black;
-}
-
-#warning {
-color : red;
+
+body{
+font-family:"frutiger linotype","lucida grande",helvetica,arial,sans-serif;
+color:#333;
+font-size: 76%;
+}
+
+
+#container{
+ font-family:arial;
+ font-size:18px;
+ float:left;
+ text-align:left;
+}
+
+#header{
+ margin-top:15px;
+ height:50px;
+ font-size:22px;
+ border-bottom:1px solid black;
+ text-align:center;
+
+}
+
+.menu{
+ float:left;
+ padding:12px;
+ width:150px;
+ height:100%;
+}
+
+#content{
+clear:both;
+background-color: #ffffff;
+color: #333;
+}
+
+#footer{
+border:1px solid black;
+}
+
+#warning {
+color : red;
}
\ No newline at end of file
diff --git a/restrict/plugins/DBMapping/data/adodb5/contrib/toxmlrpc.inc.php b/restrict/plugins/DBMapping/data/adodb5/contrib/toxmlrpc.inc.php
index 030d60a..3711bda 100755
--- a/restrict/plugins/DBMapping/data/adodb5/contrib/toxmlrpc.inc.php
+++ b/restrict/plugins/DBMapping/data/adodb5/contrib/toxmlrpc.inc.php
@@ -1,183 +1,183 @@
-GetArray()) would work with:
- * - ADODB_FETCH_BOTH
- * - null values
- */
-
- /**
- * Include the main libraries
- */
- require_once('xmlrpc.inc');
- if (!defined('ADODB_DIR')) require_once('adodb.inc.php');
-
- /**
- * Builds an xmlrpc struct value out of an AdoDB recordset
- */
- function rs2xmlrpcval(&$adodbrs) {
-
- $header = rs2xmlrpcval_header($adodbrs);
- $body = rs2xmlrpcval_body($adodbrs);
-
- // put it all together and build final xmlrpc struct
- $xmlrpcrs = new xmlrpcval ( array(
- "header" => $header,
- "body" => $body,
- ), "struct");
-
- return $xmlrpcrs;
-
- }
-
- /**
- * Builds an xmlrpc struct value describing an AdoDB recordset
- */
- function rs2xmlrpcval_header($adodbrs)
- {
- $numfields = $adodbrs->FieldCount();
- $numrecords = $adodbrs->RecordCount();
-
- // build structure holding recordset information
- $fieldstruct = array();
- for ($i = 0; $i < $numfields; $i++) {
- $fld = $adodbrs->FetchField($i);
- $fieldarray = array();
- if (isset($fld->name))
- $fieldarray["name"] = new xmlrpcval ($fld->name);
- if (isset($fld->type))
- $fieldarray["type"] = new xmlrpcval ($fld->type);
- if (isset($fld->max_length))
- $fieldarray["max_length"] = new xmlrpcval ($fld->max_length, "int");
- if (isset($fld->not_null))
- $fieldarray["not_null"] = new xmlrpcval ($fld->not_null, "boolean");
- if (isset($fld->has_default))
- $fieldarray["has_default"] = new xmlrpcval ($fld->has_default, "boolean");
- if (isset($fld->default_value))
- $fieldarray["default_value"] = new xmlrpcval ($fld->default_value);
- $fieldstruct[$i] = new xmlrpcval ($fieldarray, "struct");
- }
- $fieldcount = new xmlrpcval ($numfields, "int");
- $recordcount = new xmlrpcval ($numrecords, "int");
- $sql = new xmlrpcval ($adodbrs->sql);
- $fieldinfo = new xmlrpcval ($fieldstruct, "array");
-
- $header = new xmlrpcval ( array(
- "fieldcount" => $fieldcount,
- "recordcount" => $recordcount,
- "sql" => $sql,
- "fieldinfo" => $fieldinfo
- ), "struct");
-
- return $header;
- }
-
- /**
- * Builds an xmlrpc struct value out of an AdoDB recordset
- * (data values only, no data definition)
- */
- function rs2xmlrpcval_body($adodbrs)
- {
- $numfields = $adodbrs->FieldCount();
-
- // build structure containing recordset data
- $adodbrs->MoveFirst();
- $rows = array();
- while (!$adodbrs->EOF) {
- $columns = array();
- // This should work on all cases of fetch mode: assoc, num, both or default
- if ($adodbrs->fetchMode == 'ADODB_FETCH_BOTH' || count($adodbrs->fields) == 2 * $adodbrs->FieldCount())
- for ($i = 0; $i < $numfields; $i++)
- if ($adodbrs->fields[$i] === null)
- $columns[$i] = new xmlrpcval ('');
- else
- $columns[$i] = xmlrpc_encode ($adodbrs->fields[$i]);
- else
- foreach ($adodbrs->fields as $val)
- if ($val === null)
- $columns[] = new xmlrpcval ('');
- else
- $columns[] = xmlrpc_encode ($val);
-
- $rows[] = new xmlrpcval ($columns, "array");
-
- $adodbrs->MoveNext();
- }
- $body = new xmlrpcval ($rows, "array");
-
- return $body;
- }
-
- /**
- * Returns an xmlrpc struct value as string out of an AdoDB recordset
- */
- function rs2xmlrpcstring (&$adodbrs) {
- $xmlrpc = rs2xmlrpcval ($adodbrs);
- if ($xmlrpc)
- return $xmlrpc->serialize();
- else
- return null;
- }
-
- /**
- * Given a well-formed xmlrpc struct object returns an AdoDB object
- *
- * @todo add some error checking on the input value
- */
- function xmlrpcval2rs (&$xmlrpcval) {
-
- $fields_array = array();
- $data_array = array();
-
- // rebuild column information
- $header = $xmlrpcval->structmem('header');
-
- $numfields = $header->structmem('fieldcount');
- $numfields = $numfields->scalarval();
- $numrecords = $header->structmem('recordcount');
- $numrecords = $numrecords->scalarval();
- $sqlstring = $header->structmem('sql');
- $sqlstring = $sqlstring->scalarval();
-
- $fieldinfo = $header->structmem('fieldinfo');
- for ($i = 0; $i < $numfields; $i++) {
- $temp = $fieldinfo->arraymem($i);
- $fld = new ADOFieldObject();
- while (list($key,$value) = $temp->structeach()) {
- if ($key == "name") $fld->name = $value->scalarval();
- if ($key == "type") $fld->type = $value->scalarval();
- if ($key == "max_length") $fld->max_length = $value->scalarval();
- if ($key == "not_null") $fld->not_null = $value->scalarval();
- if ($key == "has_default") $fld->has_default = $value->scalarval();
- if ($key == "default_value") $fld->default_value = $value->scalarval();
- } // while
- $fields_array[] = $fld;
- } // for
-
- // fetch recordset information into php array
- $body = $xmlrpcval->structmem('body');
- for ($i = 0; $i < $numrecords; $i++) {
- $data_array[$i]= array();
- $xmlrpcrs_row = $body->arraymem($i);
- for ($j = 0; $j < $numfields; $j++) {
- $temp = $xmlrpcrs_row->arraymem($j);
- $data_array[$i][$j] = $temp->scalarval();
- } // for j
- } // for i
-
- // finally build in-memory recordset object and return it
- $rs = new ADORecordSet_array();
- $rs->InitArrayFields($data_array,$fields_array);
- return $rs;
-
- }
-
+GetArray()) would work with:
+ * - ADODB_FETCH_BOTH
+ * - null values
+ */
+
+ /**
+ * Include the main libraries
+ */
+ require_once('xmlrpc.inc');
+ if (!defined('ADODB_DIR')) require_once('adodb.inc.php');
+
+ /**
+ * Builds an xmlrpc struct value out of an AdoDB recordset
+ */
+ function rs2xmlrpcval(&$adodbrs) {
+
+ $header = rs2xmlrpcval_header($adodbrs);
+ $body = rs2xmlrpcval_body($adodbrs);
+
+ // put it all together and build final xmlrpc struct
+ $xmlrpcrs = new xmlrpcval ( array(
+ "header" => $header,
+ "body" => $body,
+ ), "struct");
+
+ return $xmlrpcrs;
+
+ }
+
+ /**
+ * Builds an xmlrpc struct value describing an AdoDB recordset
+ */
+ function rs2xmlrpcval_header($adodbrs)
+ {
+ $numfields = $adodbrs->FieldCount();
+ $numrecords = $adodbrs->RecordCount();
+
+ // build structure holding recordset information
+ $fieldstruct = array();
+ for ($i = 0; $i < $numfields; $i++) {
+ $fld = $adodbrs->FetchField($i);
+ $fieldarray = array();
+ if (isset($fld->name))
+ $fieldarray["name"] = new xmlrpcval ($fld->name);
+ if (isset($fld->type))
+ $fieldarray["type"] = new xmlrpcval ($fld->type);
+ if (isset($fld->max_length))
+ $fieldarray["max_length"] = new xmlrpcval ($fld->max_length, "int");
+ if (isset($fld->not_null))
+ $fieldarray["not_null"] = new xmlrpcval ($fld->not_null, "boolean");
+ if (isset($fld->has_default))
+ $fieldarray["has_default"] = new xmlrpcval ($fld->has_default, "boolean");
+ if (isset($fld->default_value))
+ $fieldarray["default_value"] = new xmlrpcval ($fld->default_value);
+ $fieldstruct[$i] = new xmlrpcval ($fieldarray, "struct");
+ }
+ $fieldcount = new xmlrpcval ($numfields, "int");
+ $recordcount = new xmlrpcval ($numrecords, "int");
+ $sql = new xmlrpcval ($adodbrs->sql);
+ $fieldinfo = new xmlrpcval ($fieldstruct, "array");
+
+ $header = new xmlrpcval ( array(
+ "fieldcount" => $fieldcount,
+ "recordcount" => $recordcount,
+ "sql" => $sql,
+ "fieldinfo" => $fieldinfo
+ ), "struct");
+
+ return $header;
+ }
+
+ /**
+ * Builds an xmlrpc struct value out of an AdoDB recordset
+ * (data values only, no data definition)
+ */
+ function rs2xmlrpcval_body($adodbrs)
+ {
+ $numfields = $adodbrs->FieldCount();
+
+ // build structure containing recordset data
+ $adodbrs->MoveFirst();
+ $rows = array();
+ while (!$adodbrs->EOF) {
+ $columns = array();
+ // This should work on all cases of fetch mode: assoc, num, both or default
+ if ($adodbrs->fetchMode == 'ADODB_FETCH_BOTH' || count($adodbrs->fields) == 2 * $adodbrs->FieldCount())
+ for ($i = 0; $i < $numfields; $i++)
+ if ($adodbrs->fields[$i] === null)
+ $columns[$i] = new xmlrpcval ('');
+ else
+ $columns[$i] = xmlrpc_encode ($adodbrs->fields[$i]);
+ else
+ foreach ($adodbrs->fields as $val)
+ if ($val === null)
+ $columns[] = new xmlrpcval ('');
+ else
+ $columns[] = xmlrpc_encode ($val);
+
+ $rows[] = new xmlrpcval ($columns, "array");
+
+ $adodbrs->MoveNext();
+ }
+ $body = new xmlrpcval ($rows, "array");
+
+ return $body;
+ }
+
+ /**
+ * Returns an xmlrpc struct value as string out of an AdoDB recordset
+ */
+ function rs2xmlrpcstring (&$adodbrs) {
+ $xmlrpc = rs2xmlrpcval ($adodbrs);
+ if ($xmlrpc)
+ return $xmlrpc->serialize();
+ else
+ return null;
+ }
+
+ /**
+ * Given a well-formed xmlrpc struct object returns an AdoDB object
+ *
+ * @todo add some error checking on the input value
+ */
+ function xmlrpcval2rs (&$xmlrpcval) {
+
+ $fields_array = array();
+ $data_array = array();
+
+ // rebuild column information
+ $header = $xmlrpcval->structmem('header');
+
+ $numfields = $header->structmem('fieldcount');
+ $numfields = $numfields->scalarval();
+ $numrecords = $header->structmem('recordcount');
+ $numrecords = $numrecords->scalarval();
+ $sqlstring = $header->structmem('sql');
+ $sqlstring = $sqlstring->scalarval();
+
+ $fieldinfo = $header->structmem('fieldinfo');
+ for ($i = 0; $i < $numfields; $i++) {
+ $temp = $fieldinfo->arraymem($i);
+ $fld = new ADOFieldObject();
+ while (list($key,$value) = $temp->structeach()) {
+ if ($key == "name") $fld->name = $value->scalarval();
+ if ($key == "type") $fld->type = $value->scalarval();
+ if ($key == "max_length") $fld->max_length = $value->scalarval();
+ if ($key == "not_null") $fld->not_null = $value->scalarval();
+ if ($key == "has_default") $fld->has_default = $value->scalarval();
+ if ($key == "default_value") $fld->default_value = $value->scalarval();
+ } // while
+ $fields_array[] = $fld;
+ } // for
+
+ // fetch recordset information into php array
+ $body = $xmlrpcval->structmem('body');
+ for ($i = 0; $i < $numrecords; $i++) {
+ $data_array[$i]= array();
+ $xmlrpcrs_row = $body->arraymem($i);
+ for ($j = 0; $j < $numfields; $j++) {
+ $temp = $xmlrpcrs_row->arraymem($j);
+ $data_array[$i][$j] = $temp->scalarval();
+ } // for j
+ } // for i
+
+ // finally build in-memory recordset object and return it
+ $rs = new ADORecordSet_array();
+ $rs->InitArrayFields($data_array,$fields_array);
+ return $rs;
+
+ }
+
?>
\ No newline at end of file
diff --git a/restrict/plugins/DBMapping/data/adodb5/docs/docs-oracle.htm b/restrict/plugins/DBMapping/data/adodb5/docs/docs-oracle.htm
index 3ee27aa..c91a8db 100755
--- a/restrict/plugins/DBMapping/data/adodb5/docs/docs-oracle.htm
+++ b/restrict/plugins/DBMapping/data/adodb5/docs/docs-oracle.htm
@@ -1,542 +1,542 @@
-
-
-
-
-ADOdb with PHP and Oracle
-
-
-
-
-
-
-
Using ADOdb with PHP and Oracle: an advanced tutorial
-
-
(c)2004-2005 John Lim. All rights reserved.
-
1. Introduction
-
Oracle is the most popular commercial database used with PHP. There are many ways of accessing Oracle databases in PHP. These include:
-
-
The oracle extension
-
The oci8 extension
-
PEAR DB library
-
ADOdb library
-
-
The wide range of choices is confusing to someone just starting with Oracle and PHP. I will briefly summarize the differences, and show you the advantages of using ADOdb.
-
First we have the C extensions which provide low-level access to Oracle functionality. These C extensions are precompiled into PHP, or linked in dynamically when the web server starts up. Just in case you need it, here's a guide to installing Oracle and PHP on Linux.
-
-
-
Oracle extension
-
Designed for Oracle 7 or earlier. This is obsolete.
-
-
-
Oci8 extension
-
Despite it's name, which implies it is only for Oracle 8i, this is the standard method for accessing databases running Oracle 8i, 9i or 10g (and later).
-
-
-
Here is an example of using the oci8 extension to query the emp table of the scott schema with bind parameters:
-
-$conn = OCILogon("scott","tiger", $tnsName);
-
-$stmt = OCIParse($conn,"select * from emp where empno > :emp order by empno");
-$emp = 7900;
-OCIBindByName($stmt, ':emp', $emp);
-$ok = OCIExecute($stmt);
-while (OCIFetchInto($stmt,$arr)) {
- print_r($arr);
- echo "<hr>";
-}
-
We also have many higher level PHP libraries that allow you to simplify the above code. The most popular are PEAR DB and ADOdb. Here are some of the differences between these libraries:
-
-
-
Feature
-
PEAR DB 1.6
-
ADOdb 4.52
-
-
-
General Style
-
Simple, easy to use. Lacks Oracle specific functionality.
-
Has multi-tier design. Simple high-level design for beginners, and also lower-level advanced Oracle functionality.
-
-
-
Support for Prepare
-
Yes, but only on one statement, as the last prepare overwrites previous prepares.
-
Yes (multiple simultaneous prepare's allowed)
-
-
-
Support for LOBs
-
No
-
Yes, using update semantics
-
-
-
Support for REF Cursors
-
No
-
Yes
-
-
-
Support for IN Parameters
-
Yes
-
Yes
-
-
-
Support for OUT Parameters
-
No
-
Yes
-
-
-
Schema creation using XML
-
No
-
Yes, including ability to define tablespaces and constraints
-
-
-
Provides database portability features
-
No
-
Yes, has some ability to abstract features that differ between databases such as dates, bind parameters, and data types.
-
-
-
Performance monitoring and tracing
-
No
-
Yes. SQL can be traced and linked to web page it was executed on. Explain plan support included.
-
-
-
Recordset caching for frequently used queries
-
No
-
Yes. Provides great speedups for SQL involving complex where, group-by and order-by clauses.
-
-
-
Popularity
-
Yes, part of PEAR release
-
Yes, many open source projects are using this software, including PostNuke, Xaraya, Mambo, Tiki Wiki.
-
-
-
Speed
-
Medium speed.
-
Very high speed. Fastest database abstraction library available for PHP. Benchmarks are available.
-
-
-
High Speed Extension available
-
No
-
Yes. You can install the optional ADOdb extension, which reimplements the most frequently used parts of ADOdb as fast C code. Note that the source code version of ADOdb runs just fine without this extension, and only makes use of the extension if detected.
-
-
-
PEAR DB is good enough for simple web apps. But if you need more power, you can see ADOdb offers more sophisticated functionality. The rest of this article will concentrate on using ADOdb with Oracle. You can find out more about connecting to Oracle later in this guide.
-
ADOdb Example
-
In ADOdb, the above oci8 example querying the emp table could be written as:
-
-include "/path/to/adodb.inc.php";
-$db = NewADOConnection("oci8");
-$db->Connect($tnsName, "scott", "tiger");
-
-$rs = $db->Execute("select * from emp where empno>:emp order by empno",
- array('emp' => 7900));
-while ($arr = $rs->FetchRow()) {
- print_r($arr);
- echo "<hr>";
-}
-
-
The Execute( ) function returns a recordset object, and you can retrieve the rows returned using $recordset->FetchRow( ).
-
If we ignore the initial connection preamble, we can see the ADOdb version is much easier and simpler:
You can also query the database using the standard Microsoft ADO MoveNext( ) metaphor. The data array for the current row is stored in the fields property of the recordset object, $rs.
-MoveNext( ) offers the highest performance among all the techniques for iterating through a recordset:
-
-$rs = $db->Execute("select * from emp where empno>:emp", array('emp' => 7900));
-while (!$rs->EOF) {
- print_r($rs->fields);
- $rs->MoveNext();
-}
-
-
And if you are interested in having the data returned in a 2-dimensional array, you can use:
-
-$arr = $db->GetArray("select * from emp where empno>:emp", array('emp' => 7900));
-
-
Now to obtain only the first row as an array:
-
-$arr = $db->GetRow("select * from emp where empno=:emp", array('emp' => 7900));
-
-
Or to retrieve only the first field of the first row:
-
-$arr = $db->GetOne("select ename from emp where empno=:emp", array('emp' => 7900));
-
-
For easy pagination support, we provide the SelectLimit function. The following will perform a select query, limiting it to 100 rows, starting from row 201 (row 1 being the 1st row):
-
When data is being returned in an array, you can choose the type of array the data is returned in.
-
-
Numeric indexes - use $connection->SetFetchMode(ADODB_FETCH_NUM).
-
Associative indexes - the keys of the array are the names of the fields (in upper-case). Use $connection->SetFetchMode(ADODB_FETCH_ASSOC).
-
Both numeric and associative indexes - use $connection->SetFetchMode(ADODB_FETCH_BOTH).
-
-
The default is ADODB_FETCH_BOTH for Oracle.
-
Caching
-
You can define a database cache directory using $ADODB_CACHE_DIR, and cache the results of frequently used queries that rarely change. This is particularly useful for SQL with complex where clauses and group-by's and order-by's. It is also good for relieving heavily-loaded database servers.
-
This example will cache the following select statement for 3600 seconds (1 hour):
-
-$ADODB_CACHE_DIR = '/var/adodb/tmp';
-$rs = $db->CacheExecute(3600, "select names from allcountries order by 1");
-
-There are analogous CacheGetArray(
-), CacheGetRow( ), CacheGetOne( ) and CacheSelectLimit( ) functions. The first parameter is the number of seconds to cache. You can also pass a bind array as a 3rd parameter (not shown above).
-
There is an alternative syntax for the caching functions. The first parameter is omitted, and you set the cacheSecs
- property of the connection object:
-
3. Using Prepare( ) For Frequently Used Statements
-
Prepare( ) is for compiling frequently used SQL statement for reuse. For example, suppose we have a large array which needs to be inserted into an Oracle database. The following will result in a massive speedup in query execution (at least 20-40%), as the SQL statement only needs to be compiled once:
Oracle treats data which is more than 4000 bytes in length specially. These are called Large Objects, or LOBs for short. Binary LOBs are BLOBs, and character LOBs are CLOBs. In most Oracle libraries, you need to do a lot of work to process LOBs, probably because Oracle designed it to work in systems with little memory. ADOdb tries to make things easy by assuming the LOB can fit into main memory.
-
ADOdb will transparently handle LOBs in select statements. The LOBs are automatically converted to PHP variables without any special coding.
-
For updating records with LOBs, the functions UpdateBlob( ) and UpdateClob( ) are provided. Here's a BLOB example. The parameters should be self-explanatory:
-
Note that LogError( ) is a user-defined function, and not part of ADOdb.
-
Inserting LOBs is more complicated. Since ADOdb 4.55, we allow you to do this
- (assuming that the photo field is a BLOB, and we want to store $blob_data into
- this field, and the primary key is the id field):
-
Oracle recordsets can be passed around as variables called REF Cursors. For example, in PL/SQL, we could define a function open_tab that returns a REF CURSOR in the first parameter:
-
-TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE;
-
-PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames IN VARCHAR) IS
- BEGIN
- OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames;
- END open_tab;
-
-
In ADOdb, we could access this REF Cursor using the ExecuteCursor() function. The following will find
- all table names that begin with 'A' in the current schema:
-
Similarly, you can use the constant OCI_B_BLOB to indicate that you are using BLOBs.
-
Reusing Bind Parameters with CURSOR_SHARING=FORCE
-
Many web programmers do not care to use bind parameters, and prefer to enter the SQL directly. So instead of:
-
-$arr = $db->GetArray("select * from emp where empno>:emp", array('emp' => 7900));
-
-
They prefer entering the values inside the SQL:
-
-$arr = $db->GetArray("select * from emp where empno>7900");
-
-
This reduces Oracle performance because Oracle will reuse compiled SQL which is identical to previously compiled SQL. The above example with the values inside the SQL
-is unlikely to be reused. As an optimization, from Oracle 8.1 onwards, you can set the following session parameter after you login:
-
-ALTER SESSION SET CURSOR_SHARING=FORCE
-
-
This will force Oracle to convert all such variables (eg. the 7900 value) into constant bind parameters, improving SQL reuse.
There are two things you need to know about dates in ADOdb.
-
First, to ensure cross-database compability, ADOdb assumes that dates are returned in ISO format (YYYY-MM-DD H24:MI:SS).
-
Secondly, since Oracle treats dates and datetime as the same data type, we decided not to display the time in the default date format. So on login, ADOdb will set the NLS_DATE_FORMAT to 'YYYY-MM-DD'. If you prefer to show the date and time by default, do this:
If you are not concerned about date portability and do not use ADOdb's portability layer, you can use your preferred date format instead.
-
-
8. Database Portability Layer
-
ADOdb provides the following functions for portably generating SQL functions
- as strings to be merged into your SQL statements:
-
-
-
Function
-
Description
-
-
-
DBDate($date)
-
Pass in a UNIX timestamp or ISO date and it will convert it to a date
- string formatted for INSERT/UPDATE
-
-
-
DBTimeStamp($date)
-
Pass in a UNIX timestamp or ISO date and it will convert it to a timestamp
- string formatted for INSERT/UPDATE
-
-
-
SQLDate($date, $fmt)
-
Portably generate a date formatted using $fmt mask, for use in SELECT
- statements.
-
-
-
OffsetDate($date, $ndays)
-
Portably generate a $date offset by $ndays.
-
-
-
Concat($s1, $s2, ...)
-
Portably concatenate strings. Alternatively, for mssql use mssqlpo driver,
- which allows || operator.
-
-
-
IfNull($fld, $replaceNull)
-
Returns a string that is the equivalent of MySQL IFNULL or Oracle NVL.
-
-
-
Param($name)
-
Generates bind placeholders, using ? or named conventions as appropriate.
-
-
$db->sysDate
Property that holds the SQL function that returns today's date
-
-
$db->sysTimeStamp
Property that holds the SQL function that returns the current
-timestamp (date+time).
-
-
-
-
$db->concat_operator
Property that holds the concatenation operator
-
-
-
$db->length
Property that holds the name of the SQL strlen function.
-
-
-
$db->upperCase
Property that holds the name of the SQL strtoupper function.
-
-
$db->random
Property that holds the SQL to generate a random number between 0.00 and 1.00.
-
-
-
$db->substr
Property that holds the name of the SQL substring function.
-
-
-
ADOdb also provides multiple oracle oci8 drivers for different scenarios:
-
-
-
Driver Name
-
Description
-
-
-
oci805
-
Specifically for Oracle 8.0.5. This driver has a slower SelectLimit( ).
-
-
-
oci8
-
The default high performance driver. The keys of associative arrays returned in a recordset are upper-case.
-
-
-
oci8po
-
The portable Oracle driver. Slightly slower than oci8. This driver uses ? instead of :bindvar for binding variables, which is the standard for other databases. Also the keys of associative arrays are in lower-case like other databases.
-
-
-
Here's an example of calling the oci8po driver. Note that the bind variables use question-mark:
Before you can use ADOdb, you need to have the Oracle client installed and setup the oci8 extension. This extension comes pre-compiled for Windows (but you still need to enable it in the php.ini file). For information on compiling the oci8 extension for PHP and Apache on Unix, there is an excellent guide at oracle.com.
-
Should You Use Persistent Connections
-
One question that is frequently asked is should you use persistent connections to Oracle. Persistent connections allow PHP to recycle existing connections, reusing them after the previous web pages have completed. Non-persistent connections close automatically after the web page has completed. Persistent connections are faster because the cost of reconnecting is expensive, but there is additional resource overhead. As an alternative, Oracle allows you to pool and reuse server processes; this is called Shared Server (also known as MTS).
-
The author's benchmarks suggest that using non-persistent connections and the Shared Server configuration offer the best performance. If Shared Server is not an option, only then consider using persistent connections.
-
Connection Examples
-
Just in case you are having problems connecting to Oracle, here are some examples:
-
a. PHP and Oracle reside on the same machine, use default SID, with non-persistent connections:
- $dsn = 'oci8://user:pwd@tnsname/?persist'; # persist is optional
- $conn = ADONewConnection($dsn); # no need for Connect/PConnect
-
- $dsn = 'oci8://user:pwd@host/sid';
- $conn = ADONewConnection($dsn);
-
- $dsn = 'oci8://user:pwd@/'; # oracle on local machine
- $conn = ADONewConnection($dsn);
-
With ADOdb data source names,
-you don't have to call Connect( ) or PConnect( ).
-
-
-
10. Error Checking
-
The examples in this article are easy to read but a bit simplistic because we ignore error-handling. Execute( ) and Connect( ) will return false on error. So a more realistic way to call Connect( ) and Execute( ) is:
-
function InvokeErrorHandler()
-{ global $db; ## assume global
- MyLogFunction($db->ErrorNo(), $db->ErrorMsg());
-}
-if (!$db->Connect($tns, $usr, $pwd)) InvokeErrorHandler();
-
-$rs = $db->Execute("select * from emp where empno>:emp order by empno",
- array('emp' => 7900));
-if (!$rs) return InvokeErrorHandler();
-while ($arr = $rs->FetchRow()) {
- print_r($arr);
- echo "<hr>";
-}
-
-
You can retrieve the error message and error number of the last SQL statement executed from ErrorMsg( ) and ErrorNo( ). You can also define a custom error handler function.
-ADOdb also supports throwing exceptions in PHP5.
-
-
Handling Large Recordsets (added 27 May 2005)
-The oci8 driver does not support counting the number of records returned in a SELECT statement, so the function RecordCount()
-is emulated when the global variable $ADODB_COUNTRECS is set to true, which is the default.
-We emulate this by buffering all the records. This can take up large amounts of memory for big recordsets.
- Set $ADODB_COUNTRECS to false for the best performance.
-
-This variable is checked every time a query is executed, so you can selectively choose which recordsets to count.
-
-
11. Other ADOdb Features
-
Schema generation. This allows you to define a schema using XML and import it into different RDBMS systems portably.
-
Performance monitoring and tracing. Highlights of performance monitoring include identification of poor and suspicious SQL, with explain plan support, and identifying which web pages the SQL ran on.
-
-
12. Download
-
You can download ADOdb from sourceforge. ADOdb uses a BSD style license. That means that it is free for commercial use, and redistribution without source code is allowed.
-
-
+
+
+
+
+ADOdb with PHP and Oracle
+
+
+
+
+
+
+
Using ADOdb with PHP and Oracle: an advanced tutorial
+
+
(c)2004-2005 John Lim. All rights reserved.
+
1. Introduction
+
Oracle is the most popular commercial database used with PHP. There are many ways of accessing Oracle databases in PHP. These include:
+
+
The oracle extension
+
The oci8 extension
+
PEAR DB library
+
ADOdb library
+
+
The wide range of choices is confusing to someone just starting with Oracle and PHP. I will briefly summarize the differences, and show you the advantages of using ADOdb.
+
First we have the C extensions which provide low-level access to Oracle functionality. These C extensions are precompiled into PHP, or linked in dynamically when the web server starts up. Just in case you need it, here's a guide to installing Oracle and PHP on Linux.
+
+
+
Oracle extension
+
Designed for Oracle 7 or earlier. This is obsolete.
+
+
+
Oci8 extension
+
Despite it's name, which implies it is only for Oracle 8i, this is the standard method for accessing databases running Oracle 8i, 9i or 10g (and later).
+
+
+
Here is an example of using the oci8 extension to query the emp table of the scott schema with bind parameters:
+
+$conn = OCILogon("scott","tiger", $tnsName);
+
+$stmt = OCIParse($conn,"select * from emp where empno > :emp order by empno");
+$emp = 7900;
+OCIBindByName($stmt, ':emp', $emp);
+$ok = OCIExecute($stmt);
+while (OCIFetchInto($stmt,$arr)) {
+ print_r($arr);
+ echo "<hr>";
+}
+
We also have many higher level PHP libraries that allow you to simplify the above code. The most popular are PEAR DB and ADOdb. Here are some of the differences between these libraries:
+
+
+
Feature
+
PEAR DB 1.6
+
ADOdb 4.52
+
+
+
General Style
+
Simple, easy to use. Lacks Oracle specific functionality.
+
Has multi-tier design. Simple high-level design for beginners, and also lower-level advanced Oracle functionality.
+
+
+
Support for Prepare
+
Yes, but only on one statement, as the last prepare overwrites previous prepares.
+
Yes (multiple simultaneous prepare's allowed)
+
+
+
Support for LOBs
+
No
+
Yes, using update semantics
+
+
+
Support for REF Cursors
+
No
+
Yes
+
+
+
Support for IN Parameters
+
Yes
+
Yes
+
+
+
Support for OUT Parameters
+
No
+
Yes
+
+
+
Schema creation using XML
+
No
+
Yes, including ability to define tablespaces and constraints
+
+
+
Provides database portability features
+
No
+
Yes, has some ability to abstract features that differ between databases such as dates, bind parameters, and data types.
+
+
+
Performance monitoring and tracing
+
No
+
Yes. SQL can be traced and linked to web page it was executed on. Explain plan support included.
+
+
+
Recordset caching for frequently used queries
+
No
+
Yes. Provides great speedups for SQL involving complex where, group-by and order-by clauses.
+
+
+
Popularity
+
Yes, part of PEAR release
+
Yes, many open source projects are using this software, including PostNuke, Xaraya, Mambo, Tiki Wiki.
+
+
+
Speed
+
Medium speed.
+
Very high speed. Fastest database abstraction library available for PHP. Benchmarks are available.
+
+
+
High Speed Extension available
+
No
+
Yes. You can install the optional ADOdb extension, which reimplements the most frequently used parts of ADOdb as fast C code. Note that the source code version of ADOdb runs just fine without this extension, and only makes use of the extension if detected.
+
+
+
PEAR DB is good enough for simple web apps. But if you need more power, you can see ADOdb offers more sophisticated functionality. The rest of this article will concentrate on using ADOdb with Oracle. You can find out more about connecting to Oracle later in this guide.
+
ADOdb Example
+
In ADOdb, the above oci8 example querying the emp table could be written as:
+
+include "/path/to/adodb.inc.php";
+$db = NewADOConnection("oci8");
+$db->Connect($tnsName, "scott", "tiger");
+
+$rs = $db->Execute("select * from emp where empno>:emp order by empno",
+ array('emp' => 7900));
+while ($arr = $rs->FetchRow()) {
+ print_r($arr);
+ echo "<hr>";
+}
+
+
The Execute( ) function returns a recordset object, and you can retrieve the rows returned using $recordset->FetchRow( ).
+
If we ignore the initial connection preamble, we can see the ADOdb version is much easier and simpler:
You can also query the database using the standard Microsoft ADO MoveNext( ) metaphor. The data array for the current row is stored in the fields property of the recordset object, $rs.
+MoveNext( ) offers the highest performance among all the techniques for iterating through a recordset:
+
+$rs = $db->Execute("select * from emp where empno>:emp", array('emp' => 7900));
+while (!$rs->EOF) {
+ print_r($rs->fields);
+ $rs->MoveNext();
+}
+
+
And if you are interested in having the data returned in a 2-dimensional array, you can use:
+
+$arr = $db->GetArray("select * from emp where empno>:emp", array('emp' => 7900));
+
+
Now to obtain only the first row as an array:
+
+$arr = $db->GetRow("select * from emp where empno=:emp", array('emp' => 7900));
+
+
Or to retrieve only the first field of the first row:
+
+$arr = $db->GetOne("select ename from emp where empno=:emp", array('emp' => 7900));
+
+
For easy pagination support, we provide the SelectLimit function. The following will perform a select query, limiting it to 100 rows, starting from row 201 (row 1 being the 1st row):
+
When data is being returned in an array, you can choose the type of array the data is returned in.
+
+
Numeric indexes - use $connection->SetFetchMode(ADODB_FETCH_NUM).
+
Associative indexes - the keys of the array are the names of the fields (in upper-case). Use $connection->SetFetchMode(ADODB_FETCH_ASSOC).
+
Both numeric and associative indexes - use $connection->SetFetchMode(ADODB_FETCH_BOTH).
+
+
The default is ADODB_FETCH_BOTH for Oracle.
+
Caching
+
You can define a database cache directory using $ADODB_CACHE_DIR, and cache the results of frequently used queries that rarely change. This is particularly useful for SQL with complex where clauses and group-by's and order-by's. It is also good for relieving heavily-loaded database servers.
+
This example will cache the following select statement for 3600 seconds (1 hour):
+
+$ADODB_CACHE_DIR = '/var/adodb/tmp';
+$rs = $db->CacheExecute(3600, "select names from allcountries order by 1");
+
+There are analogous CacheGetArray(
+), CacheGetRow( ), CacheGetOne( ) and CacheSelectLimit( ) functions. The first parameter is the number of seconds to cache. You can also pass a bind array as a 3rd parameter (not shown above).
+
There is an alternative syntax for the caching functions. The first parameter is omitted, and you set the cacheSecs
+ property of the connection object:
+
3. Using Prepare( ) For Frequently Used Statements
+
Prepare( ) is for compiling frequently used SQL statement for reuse. For example, suppose we have a large array which needs to be inserted into an Oracle database. The following will result in a massive speedup in query execution (at least 20-40%), as the SQL statement only needs to be compiled once:
Oracle treats data which is more than 4000 bytes in length specially. These are called Large Objects, or LOBs for short. Binary LOBs are BLOBs, and character LOBs are CLOBs. In most Oracle libraries, you need to do a lot of work to process LOBs, probably because Oracle designed it to work in systems with little memory. ADOdb tries to make things easy by assuming the LOB can fit into main memory.
+
ADOdb will transparently handle LOBs in select statements. The LOBs are automatically converted to PHP variables without any special coding.
+
For updating records with LOBs, the functions UpdateBlob( ) and UpdateClob( ) are provided. Here's a BLOB example. The parameters should be self-explanatory:
+
Note that LogError( ) is a user-defined function, and not part of ADOdb.
+
Inserting LOBs is more complicated. Since ADOdb 4.55, we allow you to do this
+ (assuming that the photo field is a BLOB, and we want to store $blob_data into
+ this field, and the primary key is the id field):
+
Oracle recordsets can be passed around as variables called REF Cursors. For example, in PL/SQL, we could define a function open_tab that returns a REF CURSOR in the first parameter:
+
+TYPE TabType IS REF CURSOR RETURN TAB%ROWTYPE;
+
+PROCEDURE open_tab (tabcursor IN OUT TabType,tablenames IN VARCHAR) IS
+ BEGIN
+ OPEN tabcursor FOR SELECT * FROM TAB WHERE tname LIKE tablenames;
+ END open_tab;
+
+
In ADOdb, we could access this REF Cursor using the ExecuteCursor() function. The following will find
+ all table names that begin with 'A' in the current schema:
+
Similarly, you can use the constant OCI_B_BLOB to indicate that you are using BLOBs.
+
Reusing Bind Parameters with CURSOR_SHARING=FORCE
+
Many web programmers do not care to use bind parameters, and prefer to enter the SQL directly. So instead of:
+
+$arr = $db->GetArray("select * from emp where empno>:emp", array('emp' => 7900));
+
+
They prefer entering the values inside the SQL:
+
+$arr = $db->GetArray("select * from emp where empno>7900");
+
+
This reduces Oracle performance because Oracle will reuse compiled SQL which is identical to previously compiled SQL. The above example with the values inside the SQL
+is unlikely to be reused. As an optimization, from Oracle 8.1 onwards, you can set the following session parameter after you login:
+
+ALTER SESSION SET CURSOR_SHARING=FORCE
+
+
This will force Oracle to convert all such variables (eg. the 7900 value) into constant bind parameters, improving SQL reuse.
There are two things you need to know about dates in ADOdb.
+
First, to ensure cross-database compability, ADOdb assumes that dates are returned in ISO format (YYYY-MM-DD H24:MI:SS).
+
Secondly, since Oracle treats dates and datetime as the same data type, we decided not to display the time in the default date format. So on login, ADOdb will set the NLS_DATE_FORMAT to 'YYYY-MM-DD'. If you prefer to show the date and time by default, do this:
If you are not concerned about date portability and do not use ADOdb's portability layer, you can use your preferred date format instead.
+
+
8. Database Portability Layer
+
ADOdb provides the following functions for portably generating SQL functions
+ as strings to be merged into your SQL statements:
+
+
+
Function
+
Description
+
+
+
DBDate($date)
+
Pass in a UNIX timestamp or ISO date and it will convert it to a date
+ string formatted for INSERT/UPDATE
+
+
+
DBTimeStamp($date)
+
Pass in a UNIX timestamp or ISO date and it will convert it to a timestamp
+ string formatted for INSERT/UPDATE
+
+
+
SQLDate($date, $fmt)
+
Portably generate a date formatted using $fmt mask, for use in SELECT
+ statements.
+
+
+
OffsetDate($date, $ndays)
+
Portably generate a $date offset by $ndays.
+
+
+
Concat($s1, $s2, ...)
+
Portably concatenate strings. Alternatively, for mssql use mssqlpo driver,
+ which allows || operator.
+
+
+
IfNull($fld, $replaceNull)
+
Returns a string that is the equivalent of MySQL IFNULL or Oracle NVL.
+
+
+
Param($name)
+
Generates bind placeholders, using ? or named conventions as appropriate.
+
+
$db->sysDate
Property that holds the SQL function that returns today's date
+
+
$db->sysTimeStamp
Property that holds the SQL function that returns the current
+timestamp (date+time).
+
+
+
+
$db->concat_operator
Property that holds the concatenation operator
+
+
+
$db->length
Property that holds the name of the SQL strlen function.
+
+
+
$db->upperCase
Property that holds the name of the SQL strtoupper function.
+
+
$db->random
Property that holds the SQL to generate a random number between 0.00 and 1.00.
+
+
+
$db->substr
Property that holds the name of the SQL substring function.
+
+
+
ADOdb also provides multiple oracle oci8 drivers for different scenarios:
+
+
+
Driver Name
+
Description
+
+
+
oci805
+
Specifically for Oracle 8.0.5. This driver has a slower SelectLimit( ).
+
+
+
oci8
+
The default high performance driver. The keys of associative arrays returned in a recordset are upper-case.
+
+
+
oci8po
+
The portable Oracle driver. Slightly slower than oci8. This driver uses ? instead of :bindvar for binding variables, which is the standard for other databases. Also the keys of associative arrays are in lower-case like other databases.
+
+
+
Here's an example of calling the oci8po driver. Note that the bind variables use question-mark:
Before you can use ADOdb, you need to have the Oracle client installed and setup the oci8 extension. This extension comes pre-compiled for Windows (but you still need to enable it in the php.ini file). For information on compiling the oci8 extension for PHP and Apache on Unix, there is an excellent guide at oracle.com.
+
Should You Use Persistent Connections
+
One question that is frequently asked is should you use persistent connections to Oracle. Persistent connections allow PHP to recycle existing connections, reusing them after the previous web pages have completed. Non-persistent connections close automatically after the web page has completed. Persistent connections are faster because the cost of reconnecting is expensive, but there is additional resource overhead. As an alternative, Oracle allows you to pool and reuse server processes; this is called Shared Server (also known as MTS).
+
The author's benchmarks suggest that using non-persistent connections and the Shared Server configuration offer the best performance. If Shared Server is not an option, only then consider using persistent connections.
+
Connection Examples
+
Just in case you are having problems connecting to Oracle, here are some examples:
+
a. PHP and Oracle reside on the same machine, use default SID, with non-persistent connections:
+ $dsn = 'oci8://user:pwd@tnsname/?persist'; # persist is optional
+ $conn = ADONewConnection($dsn); # no need for Connect/PConnect
+
+ $dsn = 'oci8://user:pwd@host/sid';
+ $conn = ADONewConnection($dsn);
+
+ $dsn = 'oci8://user:pwd@/'; # oracle on local machine
+ $conn = ADONewConnection($dsn);
+
With ADOdb data source names,
+you don't have to call Connect( ) or PConnect( ).
+
+
+
10. Error Checking
+
The examples in this article are easy to read but a bit simplistic because we ignore error-handling. Execute( ) and Connect( ) will return false on error. So a more realistic way to call Connect( ) and Execute( ) is:
+
function InvokeErrorHandler()
+{ global $db; ## assume global
+ MyLogFunction($db->ErrorNo(), $db->ErrorMsg());
+}
+if (!$db->Connect($tns, $usr, $pwd)) InvokeErrorHandler();
+
+$rs = $db->Execute("select * from emp where empno>:emp order by empno",
+ array('emp' => 7900));
+if (!$rs) return InvokeErrorHandler();
+while ($arr = $rs->FetchRow()) {
+ print_r($arr);
+ echo "<hr>";
+}
+
+
You can retrieve the error message and error number of the last SQL statement executed from ErrorMsg( ) and ErrorNo( ). You can also define a custom error handler function.
+ADOdb also supports throwing exceptions in PHP5.
+
+
Handling Large Recordsets (added 27 May 2005)
+The oci8 driver does not support counting the number of records returned in a SELECT statement, so the function RecordCount()
+is emulated when the global variable $ADODB_COUNTRECS is set to true, which is the default.
+We emulate this by buffering all the records. This can take up large amounts of memory for big recordsets.
+ Set $ADODB_COUNTRECS to false for the best performance.
+
+This variable is checked every time a query is executed, so you can selectively choose which recordsets to count.
+
+
11. Other ADOdb Features
+
Schema generation. This allows you to define a schema using XML and import it into different RDBMS systems portably.
+
Performance monitoring and tracing. Highlights of performance monitoring include identification of poor and suspicious SQL, with explain plan support, and identifying which web pages the SQL ran on.
+
+
12. Download
+
You can download ADOdb from sourceforge. ADOdb uses a BSD style license. That means that it is free for commercial use, and redistribution without source code is allowed.
Added GetAssoc and CacheGetAssoc to connection object.
-
Removed TextMax and CharMax functions from adodb.inc.php.
-
HasFailedTrans() returned false when trans failed. Fixed.
-
Moved perf driver classes into adodb/perf/*.php.
-
Misc improvements to performance monitoring, including UI().
-
RETVAL in mssql Parameter(), we do not append @ now.
-
Added Param($name) to connection class, returns '?' or ":$name", for defining
- bind parameters portably.
-
LogSQL traps affected_rows() and saves its value properly now. Also fixed oci8
- _stmt and _affectedrows() bugs.
-
Session code timestamp check for oci8 works now. Formerly default NLS_DATE_FORMAT
- stripped off time portion. Thx to Tony Blair (tonanbarbarian#hotmail.com). Also
- added new $conn->datetime field to oci8, controls whether MetaType() returns
- 'D' ($this->datetime==false) or 'T' ($this->datetime == true) for DATE type.
-
Fixed bugs in adodb-cryptsession.inc.php and adodb-session-clob.inc.php.
-
Fixed misc bugs in adodb_key_exists, GetInsertSQL() and GetUpdateSQL().
-
Tuned include_once handling to reduce file-system checking overhead.
-
3.91 9 Sept 2003
-
Only released to InterAkt
-
Added LogSQL() for sql logging and $ADODB_NEWCONNECTION to override factory
- for driver instantiation.
-
Added IfNull($field,$ifNull) function, thx to johnwilk#juno.com
-
Added portable substr support.
-
Now rs2html() has new parameter, $echo. Set to false to return $html instead
- of echoing it.
-
3.90 5 Sept 2003
-
First beta of performance monitoring released.
-
MySQL supports MetaTable() masking.
-
Fixed key_exists() bug in adodb-lib.inc.php
-
Added sp_executesql Prepare() support to mssql.
-
Added bind support to db2.
-
Added swedish language file - Christian Tiberg" christian#commsoft.nu
-
Bug in drop index for mssql data dict fixed. Thx to Gert-Rainer Bitterlich.
-
Left join setting for oci8 was wrong. Thx to johnwilk#juno.com
-
Added matching mask for MetaTables. Only for oci8, mssql and postgres currently.
-
Rewrite of "oracle" driver connection code, merging with "oci8", by Gaetano.
-
Added better debugging for Smart Transactions.
-
Postgres DBTimeStamp() was wrongly using TO_DATE. Changed to TO_TIMESTAMP.
-
ADODB_FETCH_CASE check pushed to ADONewConnection to allow people to define
- it after including adodb.inc.php.
-
Added portugese (brazilian) to languages. Thx to "Levi Fukumori".
-
Removed arg3 parameter from Execute/SelectLimit/Cache* functions.
-
Execute() now accepts 2-d array as $inputarray. Also changed docs of fnExecute()
- to note change in sql query counting with 2-d arrays.
-
Added MONEY to MetaType in PostgreSQL.
-
Added more debugging output to CacheFlush().
-
3.72 9 Aug 2003
-
Added qmagic($str), which is a qstr($str) that auto-checks for magic quotes
- and does the right thing...
-
Fixed CacheFlush() bug - Thx to martin#gmx.de
-
Walt Boring contributed MetaForeignKeys for postgres7.
-
_fetch() called _BlobDecode() wrongly in interbase. Fixed.
-
adodb_time bug fixed with dates after 2038 fixed by Jason Pell. http://phplens.com/lens/lensforum/msgs.php?id=6980
-
3.71 4 Aug 2003
-
The oci8 driver, MetaPrimaryKeys() did not check the owner correctly when $owner
- == false.
-
Russian language file contributed by "Cyrill Malevanov" cyrill#malevanov.spb.ru.
-
Spanish language file contributed by "Horacio Degiorgi" horaciod#codigophp.com.
-
Error handling in oci8 bugfix - if there was an error in Execute(), then when
- calling ErrorNo() and/or ErrorMsg(), the 1st call would return the error, but
- the 2nd call would return no error.
-
Error handling in odbc bugfix. ODBC would always return the last error, even
- if it happened 5 queries ago. Now we reset the errormsg to '' and errorno to
- 0 everytime before CacheExecute() and Execute().
-
3.70 29 July 2003
-
Added new SQLite driver. Tested on PHP 4.3 and PHP 5.
-
Added limited "sapdb" driver support - mainly date support.
-
The oci8 driver did not identify NUMBER with no defined precision correctly.
-
Added ADODB_FORCE_NULLS, if set, then PHP nulls are converted to SQL nulls
- in GetInsertSQL/GetUpdateSQL.
-
DBDate() and DBTimeStamp() format for postgresql had problems. Fixed.
-
Added tableoptions to ChangeTableSQL(). Thx to Mike Benoit.
-
Added charset support to postgresql. Thx to Julian Tarkhanov.
-
Changed OS check for MS-Windows to prevent confusion with darWIN (MacOS)
-
Timestamp format for db2 was wrong. Changed to yyyy-mm-dd-hh.mm.ss.nnnnnn.
-
adodb-cryptsession.php includes wrong. Fixed.
-
Added MetaForeignKeys(). Supported by mssql, odbc_mssql and oci8.
-
Fixed some oci8 MetaColumns/MetaPrimaryKeys bugs. Thx to Walt Boring.
-
adodb_getcount() did not init qryRecs to 0. Missing "WHERE" clause checking
- in GetUpdateSQL fixed. Thx to Sebastiaan van Stijn.
-
Added support for only 'VIEWS' and "TABLES" in MetaTables. From Walt Boring.
-
Upgraded to adodb-xmlschema.inc.php 0.0.2.
-
NConnect for mysql now returns value. Thx to Dennis Verspuij.
-
ADODB_FETCH_BOTH support added to interbase/firebird.
-
Czech language file contributed by Kamil Jakubovic jake#host.sk.
-
PostgreSQL BlobDecode did not use _connectionID properly. Thx to Juraj Chlebec.
-
Added some new initialization stuff for Informix. Thx to "Andrea Pinnisi" pinnisi#sysnet.it
-
ADODB_ASSOC_CASE constant wrong in sybase _fetch(). Fixed.
-
3.60 16 June 2003
-
We now SET CONCAT_NULL_YIELDS_NULL OFF for odbc_mssql driver to be compat with
- mssql driver.
-
The property $emptyDate missing from connection class. Also changed 1903 to
- constant (TIMESTAMP_FIRST_YEAR=100). Thx to Sebastiaan van Stijn.
-
ADOdb speedup optimization - we now return all arrays by reference.
-
Now DBDate() and DBTimeStamp() now accepts the string 'null' as a parameter.
- Suggested by vincent.
-
Added GetArray() to connection class.
-
Added not_null check in informix metacolumns().
-
Connection parameters for postgresql did not work correctly when port was defined.
-
DB2 is now a tested driver, making adodb 100% compatible. Extensive changes
- to odbc driver for DB2, including implementing serverinfo() and SQLDate(), switching
- to SQL_CUR_USE_ODBC as the cursor mode, and lastAffectedRows and SelectLimit()
- fixes.
-
The odbc driver's FetchField() field names did not obey ADODB_ASSOC_CASE. Fixed.
-
Some bugs in adodb_backtrace() fixed.
-
Added "INT IDENTITY" type to adorecordset::MetaType() to support odbc_mssql
- properly.
-
MetaColumns() for oci8, mssql, odbc revised to support scale. Also minor revisions
- to odbc MetaColumns() for vfp and db2 compat.
-
Added unsigned support to mysql datadict class. Thx to iamsure.
-
Infinite loop in mssql MoveNext() fixed when ADODB_FETCH_ASSOC used. Thx to
- Josh R, Night_Wulfe#hotmail.com.
-
ChangeTableSQL contributed by Florian Buzin.
-
The odbc_mssql driver now sets CONCAT_NULL_YIELDS_NULL OFF for compat with
- mssql driver.
-
-
-
3.50 19 May 2003
-
Fixed mssql compat with FreeTDS. FreeTDS does not implement mssql_fetch_assoc().
-
Merged back connection and recordset code into adodb.inc.php.
-
ADOdb sessions using oracle clobs contributed by achim.gosse#ddd.de. See adodb-session-clob.php.
-
Added /s modifier to preg_match everywhere, which ensures that regex does not
- stop at /n. Thx Pao-Hsi Huang.
-
Fixed error in metacolumns() for mssql.
-
Added time format support for SQLDate.
-
Image => B added to metatype.
-
MetaType now checks empty($this->blobSize) instead of empty($this).
-
Datadict has beta support for informix, sybase (mapped to mssql), db2 and generic
- (which is a fudge).
-
BlobEncode for postgresql uses pg_escape_bytea, if available. Needed for compat
- with 7.3.
-
Added $ADODB_LANG, to support multiple languages in MetaErrorMsg().
-
Datadict can now parse table definition as declarative text.
-
For DataDict, oci8 autoincrement trigger missing semi-colon. Fixed.
-
For DataDict, when REPLACE flag enabled, drop sequence in datadict for autoincrement
- field in postgres and oci8.s
-
Postgresql defaults to template1 database if no database defined in connect/pconnect.
-
We now clear _resultid in postgresql if query fails.
-
3.40 19 May 2003
-
Added insert_id for odbc_mssql.
-
Modified postgresql UpdateBlobFile() because it did not work in safe mode.
-
Now connection object is passed to raiseErrorFn as last parameter. Needed by
- StartTrans().
-
Added StartTrans() and CompleteTrans(). It is recommended that you do not modify
- transOff, but use the above functions.
-
oci8po now obeys ADODB_ASSOC_CASE settings.
-
Added virtualized error codes, using PEAR DB equivalents. Requires you to manually
- include adodb-error.inc.php yourself, with MetaError() and MetaErrorMsg($errno).
-
GetRowAssoc for mysql and pgsql were flawed. Fix by Ross Smith.
-
Added to datadict types I1, I2, I4 and I8. Changed datadict type 'T' to map
- to timestamp instead of datetime for postgresql.
-
Error handling in ExecuteSQLArray(), adodb-datadict.inc.php did not work.
-
We now auto-quote postgresql connection parameters when building connection
- string.
-
Added session expiry notification.
-
We now test with odbc mysql - made some changes to odbc recordset constructor.
-
MetaColumns now special cases access and other databases for odbc.
-
3.31 17 March 2003
-
Added row checking for _fetch in postgres.
-
Added Interval type to MetaType for postgres.
-
Remapped postgres driver to call postgres7 driver internally.
-
Adorecordset_array::getarray() did not return array when nRows >= 0.
-
Postgresql: at times, no error message returned by pg_result_error() but error
- message returned in pg_last_error(). Recoded again.
-
Interbase blob's now use chunking for updateblob.
-
Move() did not set EOF correctly. Reported by Jorma T.
-
We properly support mysql timestamp fields when we are creating mysql tables
- using the data-dict interface.
-
Table regex includes backticks character now.
-
3.30 3 March 2003
-
Added $ADODB_EXTENSION and $ADODB_COMPAT_FETCH constant.
-
Made blank1stItem configurable using syntax "value:text" in GetMenu/GetMenu2.
- Thx to Gabriel Birke.
-
Previously ADOdb differed from the Microsoft standard because it did not define
- what to set $this->fields when EOF was reached. Now at EOF, ADOdb sets $this->fields
- to false for all databases, which is consist with Microsoft's implementation.
- Postgresql and mysql have always worked this way (in 3.11 and earlier). If you
- are experiencing compatibility problems (and you are not using postgresql nor
- mysql) on upgrading to 3.30, try setting the global variables $ADODB_COUNTRECS
- = true (which is the default) and $ADODB_FETCH_COMPAT = true (this is a new
- global variable).
-
We now check both pg_result_error and pg_last_error as sometimes pg_result_error
- does not display anything. Iman Mayes
-
We no longer check for magic quotes gpc in Quote().
-
Misc fixes for table creation in adodb-datadict.inc.php. Thx to iamsure.
-
Time calculations use adodb_time library for all negative timestamps due to
- problems in Red Hat 7.3 or later. Formerly, only did this for Windows.
-
In mssqlpo, we now check if $sql in _query is a string before we change ||
- to +. This is to support prepared stmts.
-
Move() and MoveLast() internals changed to support to support EOF and $this->fields
- change.
-
Added ADODB_FETCH_BOTH support to mssql. Thx to Angel Fradejas afradejas#mediafusion.es
-
We now check if link resource exists before we run mysql_escape_string in
- qstr().
-
Before we flock in csv code, we check that it is not a http url.
-
3.20 17 Feb 2003
-
Added new Data Dictionary classes for creating tables and indexes. Warning
- - this is very much alpha quality code. The API can still change. See adodb/tests/test-datadict.php
- for more info.
-
We now ignore $ADODB_COUNTRECS for mysql, because PHP truncates incomplete
- recordsets when mysql_unbuffered_query() is called a second time.
-
Now postgresql works correctly when $ADODB_COUNTRECS = false.
-
Changed _adodb_getcount to properly support SELECT DISTINCT.
-
Discovered that $ADODB_COUNTRECS=true has some problems with prepared queries
- - suspect PHP bug.
-
Now GetOne and GetRow run in $ADODB_COUNTRECS=false mode for better performance.
-
Added support for mysql_real_escape_string() and pg_escape_string() in qstr().
-
Added an intermediate variable for mysql _fetch() and MoveNext() to store fields,
- to prevent overwriting field array with boolean when mysql_fetch_array() returns
- false.
-
Made arrays for getinsertsql and getupdatesql case-insensitive. Suggested by
- Tim Uckun" tim#diligence.com
-
3.11 11 Feb 2003
-
Added check for ADODB_NEVER_PERSIST constant in PConnect(). If defined, then
- PConnect() will actually call non-persistent Connect().
-
Modified interbase to properly work with Prepare().
-
Added $this->ibase_timefmt to allow you to change the date and time format.
-
Added support for $input_array parameter in CacheFlush().
-
Added experimental support for dbx, which was then removed when i found that
- it was slower than using native calls.
-
Added MetaPrimaryKeys for mssql and ibase/firebird.
-
Added new $trim parameter to GetCol and CacheGetCol
-
Uses updated adodb-time.inc.php 0.06.
-
3.10 27 Jan 2003
-
Added adodb_date(), adodb_getdate(), adodb_mktime() and adodb-time.inc.php.
-
For interbase, added code to handle unlimited number of bind parameters. From
- Daniel Hasan daniel#hasan.cl.
-
Added BlobDecode and UpdateBlob for informix. Thx to Fernando Ortiz.
-
Added constant ADODB_WINDOWS. If defined, means that running on Windows.
-
Added constant ADODB_PHPVER which stores php version as a hex num. Removed
- $ADODB_PHPVER variable.
-
Felho Bacsi reported a minor white-space regular expression problem in GetInsertSQL.
-
Modified ADO to use variant to store _affectedRows
-
Changed ibase to use base class Replace(). Modified base class Replace() to
- support ibase.
-
Changed odbc to auto-detect when 0 records returned is wrong due to bad odbc
- drivers.
-
Changed mssql to use datetimeconvert ini setting only when 4.30 or later (does
- not work in 4.23).
-
ExecuteCursor($stmt, $cursorname, $params) now accepts a new $params array
- of additional bind parameters -- William Lovaton walovaton#yahoo.com.mx.
-
Added support for sybase_unbuffered_query if ADODB_COUNTRECS == false. Thx
- to chuck may.
-
Fixed FetchNextObj() bug. Thx to Jorma Tuomainen.
-
We now use SCOPE_IDENTITY() instead of @@IDENTITY for mssql - thx to marchesini#eside.it
-
Changed postgresql movenext logic to prevent illegal row number from being
- passed to pg_fetch_array().
-
Postgresql initrs bug found by "Bogdan RIPA" bripa#interakt.ro $f1 accidentally
- named $f
-
3.00 6 Jan 2003
-
Fixed adodb-pear.inc.php syntax error.
-
Improved _adodb_getcount() to use SELECT COUNT(*) FROM ($sql) for languages
- that accept it.
-
Fixed _adodb_getcount() caching error.
-
Added sql to retrive table and column info for odbc_mssql.
-
2.91 3 Jan 2003
-
Revised PHP version checking to use $ADODB_PHPVER with legal values 0x4000,
- 0x4050, 0x4200, 0x4300.
-
Added support for bytea fields and oid blobs in postgres by allowing BlobDecode()
- to detect and convert non-oid fields. Also added BlobEncode to postgres when
- you want to encode oid blobs.
-
Added blobEncodeType property for connections to inform phpLens what encoding
- method to use for blobs.
-
Added BlobDecode() and BlobEncode() to base ADOConnection class.
-
Added umask() to _gencachename() when creating directories.
-
Added charPage for ado drivers, so you can set the code page.
-
Found misplaced MoveNext() in adodb-postgres.inc.php. Fixed.
-
Sybase SelectLimit not reliable because 'set rowcount' not cached - fixed.
-
Moved ADOConnection to adodb-connection.inc.php and ADORecordSet to adodb-recordset.inc.php.
- This allows us to use doxygen to generate documentation. Doxygen doesn't like
- the classes in the main adodb.inc.php file for some mysterious reason.
-
2.50, 14 Nov 2002
-
Added transOff and transCnt properties for disabling (transOff = true) and
- tracking transaction status (transCnt>0).
-
Added inputarray handling into _adodb_pageexecute_all_rows - "Ross Smith" RossSmith#bnw.com.
-
Fixed postgresql inconsistencies in date handling.
-
Added support for mssql_fetch_assoc.
-
Fixed $ADODB_FETCH_MODE bug in odbc MetaTables() and MetaPrimaryKeys().
-
Accidentally declared UnixDate() twice, making adodb incompatible with php
- 4.3.0. Fixed.
-
Fixed pager problems with some databases that returned -1 for _currentRow on
- MoveLast() by switching to MoveNext() in adodb-lib.inc.php.
-
Also fixed uninited $discard in adodb-lib.inc.php.
-
2.43, 25 Oct 2002
-Added ADODB_ASSOC_CASE constant to better support ibase and odbc field names.
-
Added support for NConnect() for oracle OCINLogin.
-
Fixed NumCols() bug.
-
Changed session handler to use Replace() on write.
-
Fixed oci8 SelectLimit aggregate function bug again.
-
Rewrote pivoting code.
-
2.42, 4 Oct 2002
-
Fixed ibase_fetch() problem with nulls. Also interbase now does automatic blob
- decoding, and is backward compatible. Suggested by Heinz Hombergs heinz#hhombergs.de.
-
Fixed postgresql MoveNext() problems when called repeatedly after EOF. Also
- suggested by Heinz Hombergs.
-
PageExecute() does not rewrite queries if SELECT DISTINCT is used. Requested
- by hans#velum.net
-
Added additional fixes to oci8 SelectLimit handling with aggregate functions
- - thx to Christian Bugge for reporting the problem.
-
2.41, 2 Oct 2002
-
Fixed ADODB_COUNTRECS bug in odbc. Thx to Joshua Zoshi jzoshi#hotmail.com.
-
Increased buffers for adodb-csvlib.inc.php for extremely long sql from 8192
- to 32000.
-
Revised pivottable.inc.php code. Added better support for aggregate fields.
-
Fixed mysql text/blob types problem in MetaTypes base class - thx to horacio
- degiorgi.
-
Added SQLDate($fmt,$date) function, which allows an sql date format string
- to be generated - useful for group by's.
-
Fixed bug in oci8 SelectLimit when offset>100.
-
2.40 4 Sept 2002
-
Added new NLS_DATE_FORMAT property to oci8. Suggested by Laurent NAVARRO ln#altidev.com
-
Now use bind parameters in oci8 selectlimit for better performance.
-
Fixed interbase replaceQuote for dialect != 1. Thx to "BEGUIN Pierre-Henri
- - INFOCOB" phb#infocob.com.
-
Added white-space check to QA.
-
Changed unixtimestamp to support fractional seconds (we always round down/floor
- the seconds). Thanks to beezly#beezly.org.uk.
-
Now you can set the trigger_error type your own user-defined type in adodb-errorhandler.inc.php.
- Suggested by Claudio Bustos clbustos#entelchile.net.
-
Added recordset filters with rsfilter.inc.php.
-
$conn->_rs2rs does not create a new recordset when it detects it is of type
- array. Some trickery there as there seems to be a bug in Zend Engine
-
Added render_pagelinks to adodb-pager.inc.php. Code by "Pablo Costa" pablo#cbsp.com.br.
-
MetaType() speedup in adodb.inc.php by using hashing instead of switch. Best
- performance if constant arrays are supported, as they are in PHP5.
-
adodb-session.php now updates only the expiry date if the crc32 check indicates
- that the data has not been modified.
-
2.31 20 Aug 2002
-
Made changes to pivottable.inc.php due to daniel lucuzaeu's suggestions (we sum the pivottable column if desired).
-
Fixed ErrorNo() in postgres so it does not depend on _errorMsg property.
-
Robert Tuttle added support for oracle cursors. See ExecuteCursor().
-
Fixed Replace() so it works with mysql when updating record where data has not changed. Reported by
-Cal Evans (cal#calevans.com).
-
2.30 1 Aug 2002
-
Added pivottable.inc.php. Thanks to daniel.lucazeau#ajornet.com for the original
- concept.
-
Added ADOConnection::outp($msg,$newline) to output error and debugging messages. Now
-you can override this using the ADODB_OUTP constant and use your own output handler.
-
Changed == to === for 'null' comparison. Reported by ericquil#yahoo.com
-
Fixed mssql SelectLimit( ) bug when distinct used.
-
2.30 1 Aug 2002
-
New GetCol() and CacheGetCol() from ross#bnw.com that returns the first field as a 1 dim array.
-
We have an empty recordset, but RecordCount() could return -1. Fixed. Reported by "Jonathan Polansky" jonathan#polansky.com.
-
We now check for session variable changes using strlen($sessval).crc32($sessval).
-Formerly we only used crc32().
-
Informix SelectLimit() problem with $ADODB_COUNTRECS fixed.
-
Fixed informix SELECT FIRST x DISTINCT, and not SELECT DISTINCT FIRST x - reported by F Riosa
-
Now default adodb error handlers ignores error if @ used.
-
If you set $conn->autoRollback=true, we auto-rollback persistent connections for odbc, mysql, oci8, mssql.
-Default for autoRollback is false. No need to do so for postgres.
-As interbase requires a transaction id (what a flawed api), we don't do it for interbase.
-
Changed PageExecute() to use non-greedy preg_match when searching for "FROM" keyword.
-
New driver mssqlpo, the portable mssql driver, which converts string
- concat operator from || to +.
-
Fixed ms access bug - SelectLimit() did not support ties - fixed.
-
Karsten Kraus (Karsten.Kraus#web.de), contributed error-handling code to ADONewConnection.
- Unfortunately due to backward compat problems, had to rollback most of the changes.
-
Added new parameter to GetAssoc() to allow returning an array of key-value pairs,
-ignoring any additional columns in the recordset. Off by default.
-
Corrected mssql $conn->sysDate to return only date using convert().
-
CacheExecute() improved debugging output.
-
Changed rs2html() so newlines are converted to BR tags. Also optimized rs2html() based
-on feedback by "Jerry Workman" jerry#mtncad.com.
-
Added support for Replace() with Interbase, using DELETE and INSERT.
-
Some minor optimizations (mostly removing & references when passing arrays).
-
Changed GenID() to allows id's larger than the size of an integer.
-
Added force_session property to oci8 for better updateblob() support.
-
Fixed PageExecute() which did not work properly with sql containing GROUP BY.
-
2.12 12 June 2002
-
Added toexport.inc.php to export recordsets in CSV and tab-delimited format.
-
CachePageExecute() does not work - fixed - thx John Huong.
-
Interbase aliases not set properly in FetchField() - fixed. Thx Stefan Goethals.
-
Added cache property to adodb pager class. The number of secs to cache recordsets.
-
SQL rewriting bug in pageexecute() due to skipping of newlines due to missing /s modifier. Fixed.
-
Max size of cached recordset due to a bug was 256000 bytes. Fixed.
-
Speedup of 1st invocation of CacheExecute() by tuning code.
-
We compare $rewritesql with $sql in pageexecute code in case of rewrite failure.
-
2.11 7 June 2002
-
Fixed PageExecute() rewrite sql problem - COUNT(*) and ORDER BY don't go together with
- mssql, access and postgres. Thx to Alexander Zhukov alex#unipack.ru
-
DB2 support for CHARACTER type added - thx John Huong huongch#bigfoot.com
-
For ado, $argProvider not properly checked. Fixed - kalimero#ngi.it
-
Added $conn->Replace() function for update with automatic insert if the record does not exist.
- Supported by all databases except interbase.
-
2.10 4 June 2002
-
Added uniqueSort property to indicate mssql ORDER BY cols must be unique.
-
Optimized session handler by crc32 the data. We only write if session data has changed.
-
adodb_sess_read in adodb-session.php now returns ''correctly - thanks to Jorma Tuomainen, webmaster#wizactive.com
-
Mssql driver did not throw EXECUTE errors correctly because ErrorMsg() and ErrorNo() called in wrong order.
-Pointed out by Alexios Fakos. Fixed.
-
Changed ado to use client cursors. This fixes BeginTran() problems with ado.
-
Added handling of timestamp type in ado.
-
Added to ado_mssql support for insert_id() and affected_rows().
-
Added support for mssql.datetimeconvert=0, available since php 4.2.0.
-
Made UnixDate() less strict, so that the time is ignored if present.
-
Changed quote() so that it checks for magic_quotes_gpc.
-
Changed maxblobsize for odbc to default to 64000.
-
2.00 13 May 2002
-
Added drivers informix72 for pre-7.3 versions, and oci805 for
- oracle 8.0.5, and postgres64 for postgresql 6.4 and earlier. The postgres and postgres7 drivers
- are now identical.
-
Interbase now partially supports ADODB_FETCH_BOTH, by defaulting to ASSOC mode.
-
Proper support for blobs in mssql. Also revised blob support code
-is base class. Now UpdateBlobFile() calls UpdateBlob() for consistency.
-
Added support for changed odbc_fetch_into api in php 4.2.0
-with $conn->_has_stupid_odbc_fetch_api_change.
-
Fixed spelling of tablock locking hint in GenID( ) for mssql.
-
Added RowLock( ) to several databases, including oci8, informix, sybase, etc.
- Fixed where error in mssql RowLock().
-
Added sysDate and sysTimeStamp properties to most database drivers. These are the sql
-functions/constants for that database that return the current date and current timestamp, and
-are useful for portable inserts and updates.
-
Support for RecordCount() caused date handling in sybase and mssql to break.
-Fixed, thanks to Toni Tunkkari, by creating derived classes for ADORecordSet_array for
-both databases. Generalized using arrayClass property. Also to support RecordCount(),
-changed metatype handling for ado drivers. Now the type returned in FetchField
- is no longer a number, but the 1-char data type returned by MetaType.
- At the same time, fixed a lot of date handling. Now mssql support dmy and mdy date formats.
-Also speedups in sybase and mssql with preg_match and ^ in date/timestamp handling.
-Added support in sybase and mssql for 24 hour clock in timestamps (no AM/PM).
-
Extensive revisions to informix driver - thanks to Samuel CARRIERE samuel_carriere#hotmail.com
-
Added $ok parameter to CommitTrans($ok) for easy rollbacks.
-
Fixed odbc MetaColumns and MetaTables to save and restore $ADODB_FETCH_MODE.
-
Some odbc drivers did not call the base connection class constructor. Fixed.
-
Fixed regex for GetUpdateSQL() and GetInsertSQL() to support more legal character combinations.
-
-
1.99 21 April 2002
-
Added emulated RecordCount() to all database drivers if $ADODB_COUNTRECS = true
- (which it is by default). Inspired by Cristiano Duarte (cunha17#uol.com.br).
-
Unified stored procedure support for mssql and oci8. Parameter() and PrepareSP()
- functions implemented.
-
Added support for SELECT FIRST in informix, modified hasTop property to support
- this.
-
Changed csv driver to handle updates/deletes/inserts properly (when Execute() returns true).
-Bind params also work now, and raiseErrorFn with csv driver. Added csv driver to QA process.
-
Better error checking in oci8 UpdateBlob() and UpdateBlobFile().
-
Added TIME type to MySQL - patch by Manfred h9125297#zechine.wu-wien.ac.at
-
Prepare/Execute implemented for Interbase/Firebird
-
Changed some regular expressions to be anchored by /^ $/ for speed.
-
Added UnixTimeStamp() and UnixDate() to ADOConnection(). Now these functions
- are in both ADOConnection and ADORecordSet classes.
-
Empty recordsets were not cached - fixed.
-
Thanks to Gaetano Giunta (g.giunta#libero.it) for the oci8 code review. We
- didn't agree on everything, but i hoped we agreed to disagree!
-
1.90 6 April 2002
-
Now all database drivers support fetch modes ADODB_FETCH_NUM and ADODB_FETCH_ASSOC, though
- still not fully tested. Eg. Frontbase, Sybase, Informix.
-
NextRecordSet() support for mssql. Contributed by "Sven Axelsson" sven.axelsson#bokochwebb.se
-
Added blob support for SQL Anywhere. Contributed by Wade Johnson wade#wadejohnson.de
-
Fixed some security loopholes in server.php. Server.php also supports fetch mode.
-
Generalized GenID() to support odbc and mssql drivers. Mssql no longer generates GUID's.
-
Experimental RowLock($table,$where) for mssql.
-
Properly implemented Prepare() in oci8 and ODBC.
-
Added Bind() support to oci8 to support Prepare().
-
Improved error handler. Catches CacheExecute() and GenID() errors now.
-
Now if you are running php from the command line, debugging messages do not output html formating.
-Not 100% complete, but getting there.
-
1.81 22 March 2002
-
Restored default $ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT for backward compatibility.
-
SelectLimit for oci8 improved - Our FIRST_ROWS optimization now does not overwrite existing hint.
-
New Sybase SQL Anywhere driver. Contributed by Wade Johnson wade#wadejohnson.de
-
1.80 15 March 2002
-
Redesigned directory structure of ADOdb files. Added new driver directory where
-all database drivers reside.
-
Changed caching algorithm to create subdirectories. Now we scale better.
-
Informix driver now supports insert_id(). Contribution by "Andrea Pinnisi" pinnisi#sysnet.it
-
Added experimental ISO date and FetchField support for informix.
-
Fixed a quoting bug in Execute() with bind parameters, causing problems with blobs.
-
Mssql driver speedup by 10-15%.
-
Now in CacheExecute($secs2cache,$sql,...), $secs2cache is optional. If missing, it will
-take the value defined in $connection->cacheSecs (default is 3600 seconds). Note that
-CacheSelectLimit(), the secs2cache is still compulsory - sigh.
-
Sybase SQL Anywhere driver (using ODBC) contributed by Wade Johnson wade#wadejohnson.de
-
1.72 8 March 2002
-
Added @ when returning Fields() to prevent spurious error - "Michael William Miller" mille562#pilot.msu.edu
-
MetaDatabases() for postgres contributed by Phil pamelant#nerim.net
-
Mitchell T. Young (mitch#youngfamily.org) contributed informix driver.
-
Fixed rs2html() problem. I cannot reproduce, so probably a problem with pre PHP 4.1.0 versions,
- when supporting new ADODB_FETCH_MODEs.
-
Mattia Rossi (mattia#technologist.com) contributed BlobDecode() and UpdateBlobFile() for postgresql
- using the postgres specific pg_lo_import()/pg_lo_open() - i don't use them but hopefully others will
- find this useful. See this posting
- for an example of usage.
-
Added UpdateBlobFile() for uploading files to a database.
-
Made UpdateBlob() compatible with oci8po driver.
-
Added noNullStrings support to oci8 driver. Oracle changes all ' ' strings to nulls,
- so you need to set strings to ' ' to prevent the nullifying of strings. $conn->noNullStrings = true;
- will do this for you automatically. This is useful when you define a char column as NOT NULL.
-
Fixed UnixTimeStamp() bug - wasn't setting minutes and seconds properly. Patch from Agusti Fita i Borrell agusti#anglatecnic.com.
-
Toni Tunkkari added patch for sybase dates. Problem with spaces in day part of date fixed.
-
1.71 18 Jan 2002
-
Sequence start id support. Now $conn->Gen_ID('seqname', 50) to start sequence from 50.
-
CSV driver fix for selectlimit, from Andreas - akaiser#vocote.de.
-
Gam3r spotted that a global variable was undefined in the session handler.
-
Mssql date regex had error. Fixed - reported by Minh Hoang vb_user#yahoo.com.
-
DBTimeStamp() and DBDate() now accept iso dates and unix timestamps. This means
-that the PostgreSQL handling of dates in GetInsertSQL() and GetUpdateSQL() can
-be removed. Also if these functions are passed '' or null or false, we return a SQL null.
-
GetInsertSQL() and GetUpdateSQL() now accept a new parameter, $magicq to
-indicate whether quotes should be inserted based on magic quote settings - suggested by
-dj#4ict.com.
-
Reformated docs slightly based on suggestions by Chris Small.
-
1.65 28 Dec 2001
-
Fixed borland_ibase class naming bug.
-
Now instead of using $rs->fields[0] internally, we use reset($rs->fields) so
- that we are compatible with ADODB_FETCH_ASSOC mode. Reported by Nico S.
-
Changed recordset constructor and _initrs() for oci8 so that it returns the field definitions even
- if no rows in the recordset. Reported by Rick Hickerson (rhickers#mv.mv.com).
-
Improved support for postgresql in GetInsertSQL and GetUpdateSQL by
- "mike" mike#partner2partner.com and "Ryan Bailey" rebel#windriders.com
-
1.64 20 Dec 2001
-
Danny Milosavljevic <danny.milo#gmx.net> added some patches for MySQL error handling
-and displaying default values.
-
Fixed some ADODB_FETCH_BOTH inconsistencies in odbc and interbase.
-
Added more tests to test suite to cover ADODB_FETCH_* and ADODB_ERROR_HANDLER.
-
Added firebird (ibase) driver
-
Added borland_ibase driver for interbase 6.5
-
1.63 13 Dec 2001
-Absolute to the adodb-lib.inc.php file not set properly. Fixed.
-
-
1.62 11 Dec 2001
-
Major speedup of ADOdb for low-end web sites by reducing the php code loading and compiling
-cycle. We conditionally compile not so common functions.
-Moved csv code to adodb-csvlib.inc.php to reduce adodb.inc.php parsing. This file
-is loaded only when the csv/proxy driver is used, or CacheExecute() is run.
-Also moved PageExecute(), GetSelectSQL() and GetUpdateSQL() core code to adodb-lib.inc.php.
-This reduced the 70K main adodb.inc.php file to 55K, and since at least 20K of the file
-is comments, we have reduced 50K of code in adodb.inc.php to 35K. There
- should be 35% reduction in memory and thus 35% speedup in compiling the php code for the
-main adodb.inc.php file.
-
Highly tuned SelectLimit() for oci8 for massive speed improvements on large files.
-Selecting 20 rows starting from the 20,000th row of a table is now 7 times faster.
-Thx to Tomas V V Cox.
-
Allow . and # in table definitions in GetInsertSQL and GetUpdateSQL.
- See ADODB_TABLE_REGEX constant. Thx to Ari Kuorikoski.
-
Added ADODB_PREFETCH_ROWS constant, defaulting to 10. This determines the number
-of records to prefetch in a SELECT statement. Only used by oci8.
-
Added high portability Oracle class called oci8po. This uses ? for bind variables, and
-lower cases column names.
-
Now all database drivers support $ADODB_FETCH_MODE, including interbase, ado, and odbc:
-ADODB_FETCH_NUM and ADODB_FETCH_ASSOC. ADODB_FETCH_BOTH is not fully implemented for all
-database drivers.
-
1.61 Nov 2001
-
Added PO_RecordCount() and PO_Insert_ID(). PO stands for portable. Pablo Roca
- [pabloroca#mvps.org]
-
GenID now returns 0 if not available. Safer is that you should check $conn->hasGenID
- for availability.
-
M'soft ADO we now correctly close recordset in _close() peterd#telephonetics.co.uk
-
MSSQL now supports GenID(). It generates a 16-byte GUID from mssql newid()
- function.
-
Changed ereg_replace to preg_replace in SelectLimit. This is a fix for mssql.
- Ereg doesn't support t or n! Reported by marino Carlos xaplo#postnuke-espanol.org
-
Added $recordset->connection. This is the ADOConnection object for the recordset.
-Works with cached and normal recordsets. Surprisingly, this had no affect on performance!
-
1.54 15 Nov 2001
-Fixed some more bugs in PageExecute(). I am getting sick of bug in this and will have to
-reconsider my QA here. The main issue is that I don't use PageExecute() and
-to check whether it is working requires a visual inspection of the html generated currently.
-It is possible to write a test script but it would be quite complicated :(
-
More speedups of SelectLimit() for DB2, Oci8, access, vfp, mssql.
-
-
-
1.53 7 Nov 2001
-Added support for ADODB_FETCH_ASSOC for ado and odbc drivers.
-Tuned GetRowAssoc(false) in postgresql and mysql.
-Stephen Van Dyke contributed ADOdb icon, accepted with some minor mods.
-Enabled Affected_Rows() for postgresql
-Speedup for Concat() using implode() - Benjamin Curtis ben_curtis#yahoo.com
-Fixed some more bugs in PageExecute() to prevent infinite loops
-
1.52 5 Nov 2001
-Spelling error in CacheExecute() caused it to fail. $ql should be $sql in line 625!
-Added fixes for parsing [ and ] in GetUpdateSQL().
-
1.51 5 Nov 2001
-
Oci8 SelectLimit() speedup by using OCIFetch().
-
Oci8 was mistakenly reporting errors when $db->debug = true.
-
If a connection failed with ODBC, it was not correctly reported - fixed.
-
_connectionID was inited to -1, changed to false.
-
Added $rs->FetchRow(), to simplify API, ala PEAR DB
-
Added PEAR DB compat mode, which is still faster than PEAR! See adodb-pear.inc.php.
-
Removed postgres pconnect debugging statement.
-
1.50 31 Oct 2001
-
ADOdbConnection renamed to ADOConnection, and ADOdbFieldObject to ADOFieldObject.
-
PageExecute() now checks for empty $rs correctly, and the errors in the docs on this subject have been fixed.
-
odbc_error() does not return 6 digit error correctly at times. Implemented workaround.
-
Added ADORecordSet_empty class. This will speedup INSERTS/DELETES/UPDATES because the return
-object created is much smaller.
-
Added Prepare() to odbc, and oci8 (but doesn't work properly for oci8 still).
-
Made pgsql a synonym for postgre7, and changed SELECT LIMIT to use OFFSET for compat with
-postgres 7.2.
-
Revised adodb-cryptsession.php thanks to Ari.
-
Set resources to false on _close, to force freeing of resources.
-
Added adodb-errorhandler.inc.php, adodb-errorpear.inc.php and raiseErrorFn on Freek's urging.
-
GetRowAssoc($toUpper=true): $toUpper added as default.
-
Errors when connecting to a database were not captured formerly. Now we do it correctly.
-
1.40 19 September 2001
-
PageExecute() to implement page scrolling added. Code and idea by Iván Oliva.
-
Some minor postgresql fixes.
-
Added sequence support using GenID() for postgresql, oci8, mysql, interbase.
-
Added UpdateBlob support for interbase (untested).
-
Added encrypted sessions (see adodb-cryptsession.php). By Ari Kuorikoski <kuoriari#finebyte.com>
-
1.31 21 August 2001
-
Many bug fixes thanks to "GaM3R (Cameron)" <gamr#outworld.cx>. Some session changes due to Gam3r.
-
Fixed qstr() to quote also.
-
rs2html() now pretty printed.
-
Jonathan Younger jyounger#unilab.com contributed the great idea GetUpdateSQL() and GetInsertSQL() which
-generates SQL to update and insert into a table from a recordset. Modify the recordset fields
-array, then can this function to generate the SQL (the SQL is not executed).
-
"Nicola Fankhauser" <nicola.fankhauser#couniq.com> found some bugs in date handling for mssql.
-
Added minimal Oracle support for LOBs. Still under development.
-Added $ADODB_FETCH_MODE so you can control whether recordsets return arrays which are
-numeric, associative or both. This is a global variable you set. Currently only MySQL, Oci8, Postgres
-drivers support this.
-
PostgreSQL properly closes recordsets now. Reported by several people.
-
-Added UpdateBlob() for Oracle. A hack to make it easier to save blobs.
-
-Oracle timestamps did not display properly. Fixed.
-
1.20 6 June 2001
-
Now Oracle can connect using tnsnames.ora or server and service name
-
Extensive Oci8 speed optimizations.
-Oci8 code revised to support variable binding, and /*+ FIRST_ROWS */ hint.
-
Worked around some 4.0.6 bugs in odbc_fetch_into().
-
Paolo S. Asioli paolo.asioli#libero.it suggested GetRowAssoc().
-
Escape quotes for oracle wrongly set to '. Now '' is used.
-
Variable binding now works in ODBC also.
-
Jumped to version 1.20 because I don't like 13 :-)
-
1.12 6 June 2001
-
Changed $ADODB_DIR to ADODB_DIR constant to plug a security loophole.
-
Changed _close() to close persistent connections also. Prevents connection leaks.
-
Major revision of oracle and oci8 drivers.
-Added OCI_RETURN_NULLS and OCI_RETURN_LOBS to OCIFetchInto(). BLOB, CLOB and VARCHAR2 recognition
-in MetaType() improved. MetaColumns() returns columns in correct sort order.
-
Interbase timestamp input format was wrong. Fixed.
-
1.11 20 May 2001
-
Improved file locking for Windows.
-
Probabilistic flushing of cache to avoid avalanche updates when cache timeouts.
-
Cached recordset timestamp not saved in some scenarios. Fixed.
-
1.10 19 May 2001
-
Added caching. CacheExecute() and CacheSelectLimit().
-
Fixed SelectLimit(), SELECT TOP not working under certain circumstances.
-
Added better Frontbase support of MetaTypes() by Frank M. Kromann.
-
1.01 24 April 2001
-
Fixed SelectLimit bug. not quoted properly.
-
SelectLimit: SELECT TOP -1 * FROM TABLE not support by Microsoft. Fixed.
-
GetMenu improved by glen.davies#cce.ac.nz to support multiple hilited items
-
FetchNextObject() did not work with only 1 record returned. Fixed bug reported by $tim#orotech.net
-
Fixed mysql field max_length problem. Fix suggested by Jim Nicholson (jnich#att.com)
-
1.00 16 April 2001
-
Given some brilliant suggestions on how to simplify ADOdb by akul. You no longer need to
-setup $ADODB_DIR yourself, and ADOLoadCode() is automatically called by ADONewConnection(),
-simplifying the startup code.
-
FetchNextObject() added. Suggested by Jakub Marecek. This makes FetchObject() obsolete, as
-this is more flexible and powerful.
-
Misc fixes to SelectLimit() to support Access (top must follow distinct) and Fields()
-in the array recordset. From Reinhard Balling.
-
0.96 27 Mar 2001
-
ADOConnection Close() did not return a value correctly. Thanks to akul#otamedia.com.
-
When the horrible magic_quotes is enabled, back-slash () is changed to double-backslash (\).
-This doesn't make sense for Microsoft/Sybase databases. We fix this in qstr().
-
Fixed Sybase date problem in UnixDate() thanks to Toni Tunkkari. Also fixed MSSQL problem
-in UnixDate() - thanks to milhouse31#hotmail.com.
-
MoveNext() moved to leaf classes for speed in MySQL/PostgreSQL. 10-15% speedup.
-
Added null handling in bindInputArray in Execute() -- Ron Baldwin suggestion.
-
Fixed some option tags. Thanks to john#jrmstudios.com.
-
0.95 13 Mar 2001
-
Added postgres7 database driver which supports LIMIT and other version 7 stuff in the future.
-
Added SelectLimit to ADOConnection to simulate PostgreSQL's "select * from table limit 10 offset 3".
-Added helper function GetArrayLimit() to ADORecordSet.
-
Fixed mysql metacolumns bug. Thanks to Freek Dijkstra (phpeverywhere#macfreek.com).
-
Also many PostgreSQL changes by Freek. He almost rewrote the whole PostgreSQL driver!
-
Added fix to input parameters in Execute for non-strings by Ron Baldwin.
-
Added new metatype, X for TeXt. Formerly, metatype B for Blob also included
-text fields. Now 'B' is for binary/image data. 'X' for textual data.
-
Fixed $this->GetArray() in GetRows().
-
Oracle and OCI8: 1st parameter is always blank -- now warns if it is filled.
-
Now hasLimit and hasTop added to indicate whether
-SELECT * FROM TABLE LIMIT 10 or SELECT TOP 10 * FROM TABLE are supported.
-
0.94 04 Feb 2001
-
Added ADORecordSet::GetRows() for compatibility with Microsoft ADO. Synonym for GetArray().
-
Added new metatype 'R' to represent autoincrement numbers.
-
Added ADORecordSet.FetchObject() to return a row as an object.
-
Finally got a Linux box to test PostgreSql. Many fixes.
-
Fixed copyright misspellings in 0.93.
-
Fixed mssql MetaColumns type bug.
-
Worked around odbc bug in PHP4 for sessions.
-
Fixed many documentation bugs (affected_rows, metadatabases, qstr).
-
Fixed MySQL timestamp format (removed comma).
-
Interbase driver did not call ibase_pconnect(). Fixed.
-
0.93 18 Jan 2002
-
Fixed GetMenu bug.
-
Simplified Interbase commit and rollback.
-
Default behaviour on closing a connection is now to rollback all active transactions.
-
Added field object handling for array recordset for future XML compatibility.
-
Added arr2html() to convert array to html table.
-
0.92 2 Jan 2002
-
Interbase Commit and Rollback should be working again.
-
Changed initialisation of ADORecordSet. This is internal and should not affect users. We
-are doing this to support cached recordsets in the future.
-
-
Implemented ADORecordSet_array class. This allows you to simulate a database recordset
-with an array.
-
Added UnixDate() and UnixTimeStamp() to ADORecordSet.
-
0.91 21 Dec 2000
-
Fixed ODBC so ErrorMsg() is working.
-
Worked around ADO unrecognised null (0x1) value problem in COM.
-
Added Sybase support for FetchField() type
-
Removed debugging code and unneeded html from various files
-
Changed to javadoc style comments to adodb.inc.php.
-
Added maxsql as synonym for mysqlt
-
Now ODBC downloads first 8K of blob by default
-
0.90 15 Nov 2000
-
Lots of testing of Microsoft ADO. Should be more stable now.
-
Added $ADODB_COUNTREC. Set to false for high speed selects.
-
Added Sybase support. Contributed by Toni Tunkkari (toni.tunkkari#finebyte.com). Bug in Sybase
- API: GetFields is unable to determine date types.
-
Changed behaviour of RecordSet.GetMenu() to support size parameter (listbox) properly.
-
Added emptyDate and emptyTimeStamp to RecordSet class that defines how to represent
- empty dates.
-
Added MetaColumns($table) that returns an array of ADOFieldObject's listing
- the columns of a table.
-
Added transaction support for PostgresSQL -- thanks to "Eric G. Werk" egw#netguide.dk.
-
Added adodb-session.php for session support.
-
0.80 30 Nov 2000
-
Added support for charSet for interbase. Implemented MetaTables for most databases.
- PostgreSQL more extensively tested.
-
0.71 22 Nov 2000
-
Switched from using require_once to include/include_once for backward compatability with PHP 4.02 and earlier.
-
0.70 15 Nov 2000
-
Calls by reference have been removed (call_time_pass_reference=Off) to ensure compatibility with future versions of PHP,
-except in Oracle 7 driver due to a bug in php_oracle.dll.
-
PostgreSQL database driver contributed by Alberto Cerezal (acerezalp#dbnet.es).
-
-
Oci8 driver for Oracle 8 contributed by George Fourlanos (fou#infomap.gr).
-
Added mysqlt database driver to support MySQL 3.23 which has transaction
- support.
-
Oracle default date format (DD-MON-YY) did not match ADOdb default date format (which is YYYY-MM-DD). Use ALTER SESSION to force the default date.
-
Error message checking is now included in test suite.
-
MoveNext() did not check EOF properly -- fixed.
-
0.60 Nov 8 2000
-
Fixed some constructor bugs in ODBC and ADO. Added ErrorNo function to ADOConnection
- class.
-
0.51 Oct 18 2000
-
Fixed some interbase bugs.
-
0.50 Oct 16 2000
-
Interbase commit/rollback changed to be compatible with PHP 4.03.
-
CommitTrans( ) will now return true if transactions not supported.
-
Conversely RollbackTrans( ) will return false if transactions not supported.
-
-
0.46 Oct 12
-Many Oracle compatibility issues fixed.
-
0.40 Sept 26
-
Many bug fixes
-
Now Code for BeginTrans, CommitTrans and RollbackTrans is working. So is the Affected_Rows
-and Insert_ID. Added above functions to test.php.
-
ADO type handling was busted in 0.30. Fixed.
-
Generalised Move( ) so it works will all databases, including ODBC.
-
0.30 Sept 18
-
Renamed ADOLoadDB to ADOLoadCode. This is clearer.
-
Added BeginTrans, CommitTrans and RollbackTrans functions.
-
Added Affected_Rows() and Insert_ID(), _affectedrows() and _insertID(), ListTables(),
- ListDatabases(), ListColumns().
-
Need to add New_ID() and hasInsertID and hasAffectedRows, autoCommit
-
0.20 Sept 12
-
Added support for Microsoft's ADO.
-
Added new field to ADORecordSet -- canSeek
-
Added new parameter to _fetch($ignore_fields = false). Setting to true will
- not update fields array for faster performance.
-
Added new field to ADORecordSet/ADOConnection -- dataProvider to indicate whether
- a class is derived from odbc or ado.
-
Changed class ODBCFieldObject to ADOFieldObject -- not documented currently.
-
Added benchmark.php and testdatabases.inc.php to the test suite.
-
Added to ADORecordSet FastForward( ) for future high speed scrolling. Not documented.
Added GetAssoc and CacheGetAssoc to connection object.
+
Removed TextMax and CharMax functions from adodb.inc.php.
+
HasFailedTrans() returned false when trans failed. Fixed.
+
Moved perf driver classes into adodb/perf/*.php.
+
Misc improvements to performance monitoring, including UI().
+
RETVAL in mssql Parameter(), we do not append @ now.
+
Added Param($name) to connection class, returns '?' or ":$name", for defining
+ bind parameters portably.
+
LogSQL traps affected_rows() and saves its value properly now. Also fixed oci8
+ _stmt and _affectedrows() bugs.
+
Session code timestamp check for oci8 works now. Formerly default NLS_DATE_FORMAT
+ stripped off time portion. Thx to Tony Blair (tonanbarbarian#hotmail.com). Also
+ added new $conn->datetime field to oci8, controls whether MetaType() returns
+ 'D' ($this->datetime==false) or 'T' ($this->datetime == true) for DATE type.
+
Fixed bugs in adodb-cryptsession.inc.php and adodb-session-clob.inc.php.
+
Fixed misc bugs in adodb_key_exists, GetInsertSQL() and GetUpdateSQL().
+
Tuned include_once handling to reduce file-system checking overhead.
+
3.91 9 Sept 2003
+
Only released to InterAkt
+
Added LogSQL() for sql logging and $ADODB_NEWCONNECTION to override factory
+ for driver instantiation.
+
Added IfNull($field,$ifNull) function, thx to johnwilk#juno.com
+
Added portable substr support.
+
Now rs2html() has new parameter, $echo. Set to false to return $html instead
+ of echoing it.
+
3.90 5 Sept 2003
+
First beta of performance monitoring released.
+
MySQL supports MetaTable() masking.
+
Fixed key_exists() bug in adodb-lib.inc.php
+
Added sp_executesql Prepare() support to mssql.
+
Added bind support to db2.
+
Added swedish language file - Christian Tiberg" christian#commsoft.nu
+
Bug in drop index for mssql data dict fixed. Thx to Gert-Rainer Bitterlich.
+
Left join setting for oci8 was wrong. Thx to johnwilk#juno.com
+
Added matching mask for MetaTables. Only for oci8, mssql and postgres currently.
+
Rewrite of "oracle" driver connection code, merging with "oci8", by Gaetano.
+
Added better debugging for Smart Transactions.
+
Postgres DBTimeStamp() was wrongly using TO_DATE. Changed to TO_TIMESTAMP.
+
ADODB_FETCH_CASE check pushed to ADONewConnection to allow people to define
+ it after including adodb.inc.php.
+
Added portugese (brazilian) to languages. Thx to "Levi Fukumori".
+
Removed arg3 parameter from Execute/SelectLimit/Cache* functions.
+
Execute() now accepts 2-d array as $inputarray. Also changed docs of fnExecute()
+ to note change in sql query counting with 2-d arrays.
+
Added MONEY to MetaType in PostgreSQL.
+
Added more debugging output to CacheFlush().
+
3.72 9 Aug 2003
+
Added qmagic($str), which is a qstr($str) that auto-checks for magic quotes
+ and does the right thing...
+
Fixed CacheFlush() bug - Thx to martin#gmx.de
+
Walt Boring contributed MetaForeignKeys for postgres7.
+
_fetch() called _BlobDecode() wrongly in interbase. Fixed.
+
adodb_time bug fixed with dates after 2038 fixed by Jason Pell. http://phplens.com/lens/lensforum/msgs.php?id=6980
+
3.71 4 Aug 2003
+
The oci8 driver, MetaPrimaryKeys() did not check the owner correctly when $owner
+ == false.
+
Russian language file contributed by "Cyrill Malevanov" cyrill#malevanov.spb.ru.
+
Spanish language file contributed by "Horacio Degiorgi" horaciod#codigophp.com.
+
Error handling in oci8 bugfix - if there was an error in Execute(), then when
+ calling ErrorNo() and/or ErrorMsg(), the 1st call would return the error, but
+ the 2nd call would return no error.
+
Error handling in odbc bugfix. ODBC would always return the last error, even
+ if it happened 5 queries ago. Now we reset the errormsg to '' and errorno to
+ 0 everytime before CacheExecute() and Execute().
+
3.70 29 July 2003
+
Added new SQLite driver. Tested on PHP 4.3 and PHP 5.
+
Added limited "sapdb" driver support - mainly date support.
+
The oci8 driver did not identify NUMBER with no defined precision correctly.
+
Added ADODB_FORCE_NULLS, if set, then PHP nulls are converted to SQL nulls
+ in GetInsertSQL/GetUpdateSQL.
+
DBDate() and DBTimeStamp() format for postgresql had problems. Fixed.
+
Added tableoptions to ChangeTableSQL(). Thx to Mike Benoit.
+
Added charset support to postgresql. Thx to Julian Tarkhanov.
+
Changed OS check for MS-Windows to prevent confusion with darWIN (MacOS)
+
Timestamp format for db2 was wrong. Changed to yyyy-mm-dd-hh.mm.ss.nnnnnn.
+
adodb-cryptsession.php includes wrong. Fixed.
+
Added MetaForeignKeys(). Supported by mssql, odbc_mssql and oci8.
+
Fixed some oci8 MetaColumns/MetaPrimaryKeys bugs. Thx to Walt Boring.
+
adodb_getcount() did not init qryRecs to 0. Missing "WHERE" clause checking
+ in GetUpdateSQL fixed. Thx to Sebastiaan van Stijn.
+
Added support for only 'VIEWS' and "TABLES" in MetaTables. From Walt Boring.
+
Upgraded to adodb-xmlschema.inc.php 0.0.2.
+
NConnect for mysql now returns value. Thx to Dennis Verspuij.
+
ADODB_FETCH_BOTH support added to interbase/firebird.
+
Czech language file contributed by Kamil Jakubovic jake#host.sk.
+
PostgreSQL BlobDecode did not use _connectionID properly. Thx to Juraj Chlebec.
+
Added some new initialization stuff for Informix. Thx to "Andrea Pinnisi" pinnisi#sysnet.it
+
ADODB_ASSOC_CASE constant wrong in sybase _fetch(). Fixed.
+
3.60 16 June 2003
+
We now SET CONCAT_NULL_YIELDS_NULL OFF for odbc_mssql driver to be compat with
+ mssql driver.
+
The property $emptyDate missing from connection class. Also changed 1903 to
+ constant (TIMESTAMP_FIRST_YEAR=100). Thx to Sebastiaan van Stijn.
+
ADOdb speedup optimization - we now return all arrays by reference.
+
Now DBDate() and DBTimeStamp() now accepts the string 'null' as a parameter.
+ Suggested by vincent.
+
Added GetArray() to connection class.
+
Added not_null check in informix metacolumns().
+
Connection parameters for postgresql did not work correctly when port was defined.
+
DB2 is now a tested driver, making adodb 100% compatible. Extensive changes
+ to odbc driver for DB2, including implementing serverinfo() and SQLDate(), switching
+ to SQL_CUR_USE_ODBC as the cursor mode, and lastAffectedRows and SelectLimit()
+ fixes.
+
The odbc driver's FetchField() field names did not obey ADODB_ASSOC_CASE. Fixed.
+
Some bugs in adodb_backtrace() fixed.
+
Added "INT IDENTITY" type to adorecordset::MetaType() to support odbc_mssql
+ properly.
+
MetaColumns() for oci8, mssql, odbc revised to support scale. Also minor revisions
+ to odbc MetaColumns() for vfp and db2 compat.
+
Added unsigned support to mysql datadict class. Thx to iamsure.
+
Infinite loop in mssql MoveNext() fixed when ADODB_FETCH_ASSOC used. Thx to
+ Josh R, Night_Wulfe#hotmail.com.
+
ChangeTableSQL contributed by Florian Buzin.
+
The odbc_mssql driver now sets CONCAT_NULL_YIELDS_NULL OFF for compat with
+ mssql driver.
+
+
+
3.50 19 May 2003
+
Fixed mssql compat with FreeTDS. FreeTDS does not implement mssql_fetch_assoc().
+
Merged back connection and recordset code into adodb.inc.php.
+
ADOdb sessions using oracle clobs contributed by achim.gosse#ddd.de. See adodb-session-clob.php.
+
Added /s modifier to preg_match everywhere, which ensures that regex does not
+ stop at /n. Thx Pao-Hsi Huang.
+
Fixed error in metacolumns() for mssql.
+
Added time format support for SQLDate.
+
Image => B added to metatype.
+
MetaType now checks empty($this->blobSize) instead of empty($this).
+
Datadict has beta support for informix, sybase (mapped to mssql), db2 and generic
+ (which is a fudge).
+
BlobEncode for postgresql uses pg_escape_bytea, if available. Needed for compat
+ with 7.3.
+
Added $ADODB_LANG, to support multiple languages in MetaErrorMsg().
+
Datadict can now parse table definition as declarative text.
+
For DataDict, oci8 autoincrement trigger missing semi-colon. Fixed.
+
For DataDict, when REPLACE flag enabled, drop sequence in datadict for autoincrement
+ field in postgres and oci8.s
+
Postgresql defaults to template1 database if no database defined in connect/pconnect.
+
We now clear _resultid in postgresql if query fails.
+
3.40 19 May 2003
+
Added insert_id for odbc_mssql.
+
Modified postgresql UpdateBlobFile() because it did not work in safe mode.
+
Now connection object is passed to raiseErrorFn as last parameter. Needed by
+ StartTrans().
+
Added StartTrans() and CompleteTrans(). It is recommended that you do not modify
+ transOff, but use the above functions.
+
oci8po now obeys ADODB_ASSOC_CASE settings.
+
Added virtualized error codes, using PEAR DB equivalents. Requires you to manually
+ include adodb-error.inc.php yourself, with MetaError() and MetaErrorMsg($errno).
+
GetRowAssoc for mysql and pgsql were flawed. Fix by Ross Smith.
+
Added to datadict types I1, I2, I4 and I8. Changed datadict type 'T' to map
+ to timestamp instead of datetime for postgresql.
+
Error handling in ExecuteSQLArray(), adodb-datadict.inc.php did not work.
+
We now auto-quote postgresql connection parameters when building connection
+ string.
+
Added session expiry notification.
+
We now test with odbc mysql - made some changes to odbc recordset constructor.
+
MetaColumns now special cases access and other databases for odbc.
+
3.31 17 March 2003
+
Added row checking for _fetch in postgres.
+
Added Interval type to MetaType for postgres.
+
Remapped postgres driver to call postgres7 driver internally.
+
Adorecordset_array::getarray() did not return array when nRows >= 0.
+
Postgresql: at times, no error message returned by pg_result_error() but error
+ message returned in pg_last_error(). Recoded again.
+
Interbase blob's now use chunking for updateblob.
+
Move() did not set EOF correctly. Reported by Jorma T.
+
We properly support mysql timestamp fields when we are creating mysql tables
+ using the data-dict interface.
+
Table regex includes backticks character now.
+
3.30 3 March 2003
+
Added $ADODB_EXTENSION and $ADODB_COMPAT_FETCH constant.
+
Made blank1stItem configurable using syntax "value:text" in GetMenu/GetMenu2.
+ Thx to Gabriel Birke.
+
Previously ADOdb differed from the Microsoft standard because it did not define
+ what to set $this->fields when EOF was reached. Now at EOF, ADOdb sets $this->fields
+ to false for all databases, which is consist with Microsoft's implementation.
+ Postgresql and mysql have always worked this way (in 3.11 and earlier). If you
+ are experiencing compatibility problems (and you are not using postgresql nor
+ mysql) on upgrading to 3.30, try setting the global variables $ADODB_COUNTRECS
+ = true (which is the default) and $ADODB_FETCH_COMPAT = true (this is a new
+ global variable).
+
We now check both pg_result_error and pg_last_error as sometimes pg_result_error
+ does not display anything. Iman Mayes
+
We no longer check for magic quotes gpc in Quote().
+
Misc fixes for table creation in adodb-datadict.inc.php. Thx to iamsure.
+
Time calculations use adodb_time library for all negative timestamps due to
+ problems in Red Hat 7.3 or later. Formerly, only did this for Windows.
+
In mssqlpo, we now check if $sql in _query is a string before we change ||
+ to +. This is to support prepared stmts.
+
Move() and MoveLast() internals changed to support to support EOF and $this->fields
+ change.
+
Added ADODB_FETCH_BOTH support to mssql. Thx to Angel Fradejas afradejas#mediafusion.es
+
We now check if link resource exists before we run mysql_escape_string in
+ qstr().
+
Before we flock in csv code, we check that it is not a http url.
+
3.20 17 Feb 2003
+
Added new Data Dictionary classes for creating tables and indexes. Warning
+ - this is very much alpha quality code. The API can still change. See adodb/tests/test-datadict.php
+ for more info.
+
We now ignore $ADODB_COUNTRECS for mysql, because PHP truncates incomplete
+ recordsets when mysql_unbuffered_query() is called a second time.
+
Now postgresql works correctly when $ADODB_COUNTRECS = false.
+
Changed _adodb_getcount to properly support SELECT DISTINCT.
+
Discovered that $ADODB_COUNTRECS=true has some problems with prepared queries
+ - suspect PHP bug.
+
Now GetOne and GetRow run in $ADODB_COUNTRECS=false mode for better performance.
+
Added support for mysql_real_escape_string() and pg_escape_string() in qstr().
+
Added an intermediate variable for mysql _fetch() and MoveNext() to store fields,
+ to prevent overwriting field array with boolean when mysql_fetch_array() returns
+ false.
+
Made arrays for getinsertsql and getupdatesql case-insensitive. Suggested by
+ Tim Uckun" tim#diligence.com
+
3.11 11 Feb 2003
+
Added check for ADODB_NEVER_PERSIST constant in PConnect(). If defined, then
+ PConnect() will actually call non-persistent Connect().
+
Modified interbase to properly work with Prepare().
+
Added $this->ibase_timefmt to allow you to change the date and time format.
+
Added support for $input_array parameter in CacheFlush().
+
Added experimental support for dbx, which was then removed when i found that
+ it was slower than using native calls.
+
Added MetaPrimaryKeys for mssql and ibase/firebird.
+
Added new $trim parameter to GetCol and CacheGetCol
+
Uses updated adodb-time.inc.php 0.06.
+
3.10 27 Jan 2003
+
Added adodb_date(), adodb_getdate(), adodb_mktime() and adodb-time.inc.php.
+
For interbase, added code to handle unlimited number of bind parameters. From
+ Daniel Hasan daniel#hasan.cl.
+
Added BlobDecode and UpdateBlob for informix. Thx to Fernando Ortiz.
+
Added constant ADODB_WINDOWS. If defined, means that running on Windows.
+
Added constant ADODB_PHPVER which stores php version as a hex num. Removed
+ $ADODB_PHPVER variable.
+
Felho Bacsi reported a minor white-space regular expression problem in GetInsertSQL.
+
Modified ADO to use variant to store _affectedRows
+
Changed ibase to use base class Replace(). Modified base class Replace() to
+ support ibase.
+
Changed odbc to auto-detect when 0 records returned is wrong due to bad odbc
+ drivers.
+
Changed mssql to use datetimeconvert ini setting only when 4.30 or later (does
+ not work in 4.23).
+
ExecuteCursor($stmt, $cursorname, $params) now accepts a new $params array
+ of additional bind parameters -- William Lovaton walovaton#yahoo.com.mx.
+
Added support for sybase_unbuffered_query if ADODB_COUNTRECS == false. Thx
+ to chuck may.
+
Fixed FetchNextObj() bug. Thx to Jorma Tuomainen.
+
We now use SCOPE_IDENTITY() instead of @@IDENTITY for mssql - thx to marchesini#eside.it
+
Changed postgresql movenext logic to prevent illegal row number from being
+ passed to pg_fetch_array().
+
Postgresql initrs bug found by "Bogdan RIPA" bripa#interakt.ro $f1 accidentally
+ named $f
+
3.00 6 Jan 2003
+
Fixed adodb-pear.inc.php syntax error.
+
Improved _adodb_getcount() to use SELECT COUNT(*) FROM ($sql) for languages
+ that accept it.
+
Fixed _adodb_getcount() caching error.
+
Added sql to retrive table and column info for odbc_mssql.
+
2.91 3 Jan 2003
+
Revised PHP version checking to use $ADODB_PHPVER with legal values 0x4000,
+ 0x4050, 0x4200, 0x4300.
+
Added support for bytea fields and oid blobs in postgres by allowing BlobDecode()
+ to detect and convert non-oid fields. Also added BlobEncode to postgres when
+ you want to encode oid blobs.
+
Added blobEncodeType property for connections to inform phpLens what encoding
+ method to use for blobs.
+
Added BlobDecode() and BlobEncode() to base ADOConnection class.
+
Added umask() to _gencachename() when creating directories.
+
Added charPage for ado drivers, so you can set the code page.
+
Found misplaced MoveNext() in adodb-postgres.inc.php. Fixed.
+
Sybase SelectLimit not reliable because 'set rowcount' not cached - fixed.
+
Moved ADOConnection to adodb-connection.inc.php and ADORecordSet to adodb-recordset.inc.php.
+ This allows us to use doxygen to generate documentation. Doxygen doesn't like
+ the classes in the main adodb.inc.php file for some mysterious reason.
+
2.50, 14 Nov 2002
+
Added transOff and transCnt properties for disabling (transOff = true) and
+ tracking transaction status (transCnt>0).
+
Added inputarray handling into _adodb_pageexecute_all_rows - "Ross Smith" RossSmith#bnw.com.
+
Fixed postgresql inconsistencies in date handling.
+
Added support for mssql_fetch_assoc.
+
Fixed $ADODB_FETCH_MODE bug in odbc MetaTables() and MetaPrimaryKeys().
+
Accidentally declared UnixDate() twice, making adodb incompatible with php
+ 4.3.0. Fixed.
+
Fixed pager problems with some databases that returned -1 for _currentRow on
+ MoveLast() by switching to MoveNext() in adodb-lib.inc.php.
+
Also fixed uninited $discard in adodb-lib.inc.php.
+
2.43, 25 Oct 2002
+Added ADODB_ASSOC_CASE constant to better support ibase and odbc field names.
+
Added support for NConnect() for oracle OCINLogin.
+
Fixed NumCols() bug.
+
Changed session handler to use Replace() on write.
+
Fixed oci8 SelectLimit aggregate function bug again.
+
Rewrote pivoting code.
+
2.42, 4 Oct 2002
+
Fixed ibase_fetch() problem with nulls. Also interbase now does automatic blob
+ decoding, and is backward compatible. Suggested by Heinz Hombergs heinz#hhombergs.de.
+
Fixed postgresql MoveNext() problems when called repeatedly after EOF. Also
+ suggested by Heinz Hombergs.
+
PageExecute() does not rewrite queries if SELECT DISTINCT is used. Requested
+ by hans#velum.net
+
Added additional fixes to oci8 SelectLimit handling with aggregate functions
+ - thx to Christian Bugge for reporting the problem.
+
2.41, 2 Oct 2002
+
Fixed ADODB_COUNTRECS bug in odbc. Thx to Joshua Zoshi jzoshi#hotmail.com.
+
Increased buffers for adodb-csvlib.inc.php for extremely long sql from 8192
+ to 32000.
+
Revised pivottable.inc.php code. Added better support for aggregate fields.
+
Fixed mysql text/blob types problem in MetaTypes base class - thx to horacio
+ degiorgi.
+
Added SQLDate($fmt,$date) function, which allows an sql date format string
+ to be generated - useful for group by's.
+
Fixed bug in oci8 SelectLimit when offset>100.
+
2.40 4 Sept 2002
+
Added new NLS_DATE_FORMAT property to oci8. Suggested by Laurent NAVARRO ln#altidev.com
+
Now use bind parameters in oci8 selectlimit for better performance.
+
Fixed interbase replaceQuote for dialect != 1. Thx to "BEGUIN Pierre-Henri
+ - INFOCOB" phb#infocob.com.
+
Added white-space check to QA.
+
Changed unixtimestamp to support fractional seconds (we always round down/floor
+ the seconds). Thanks to beezly#beezly.org.uk.
+
Now you can set the trigger_error type your own user-defined type in adodb-errorhandler.inc.php.
+ Suggested by Claudio Bustos clbustos#entelchile.net.
+
Added recordset filters with rsfilter.inc.php.
+
$conn->_rs2rs does not create a new recordset when it detects it is of type
+ array. Some trickery there as there seems to be a bug in Zend Engine
+
Added render_pagelinks to adodb-pager.inc.php. Code by "Pablo Costa" pablo#cbsp.com.br.
+
MetaType() speedup in adodb.inc.php by using hashing instead of switch. Best
+ performance if constant arrays are supported, as they are in PHP5.
+
adodb-session.php now updates only the expiry date if the crc32 check indicates
+ that the data has not been modified.
+
2.31 20 Aug 2002
+
Made changes to pivottable.inc.php due to daniel lucuzaeu's suggestions (we sum the pivottable column if desired).
+
Fixed ErrorNo() in postgres so it does not depend on _errorMsg property.
+
Robert Tuttle added support for oracle cursors. See ExecuteCursor().
+
Fixed Replace() so it works with mysql when updating record where data has not changed. Reported by
+Cal Evans (cal#calevans.com).
+
2.30 1 Aug 2002
+
Added pivottable.inc.php. Thanks to daniel.lucazeau#ajornet.com for the original
+ concept.
+
Added ADOConnection::outp($msg,$newline) to output error and debugging messages. Now
+you can override this using the ADODB_OUTP constant and use your own output handler.
+
Changed == to === for 'null' comparison. Reported by ericquil#yahoo.com
+
Fixed mssql SelectLimit( ) bug when distinct used.
+
2.30 1 Aug 2002
+
New GetCol() and CacheGetCol() from ross#bnw.com that returns the first field as a 1 dim array.
+
We have an empty recordset, but RecordCount() could return -1. Fixed. Reported by "Jonathan Polansky" jonathan#polansky.com.
+
We now check for session variable changes using strlen($sessval).crc32($sessval).
+Formerly we only used crc32().
+
Informix SelectLimit() problem with $ADODB_COUNTRECS fixed.
+
Fixed informix SELECT FIRST x DISTINCT, and not SELECT DISTINCT FIRST x - reported by F Riosa
+
Now default adodb error handlers ignores error if @ used.
+
If you set $conn->autoRollback=true, we auto-rollback persistent connections for odbc, mysql, oci8, mssql.
+Default for autoRollback is false. No need to do so for postgres.
+As interbase requires a transaction id (what a flawed api), we don't do it for interbase.
+
Changed PageExecute() to use non-greedy preg_match when searching for "FROM" keyword.
+
New driver mssqlpo, the portable mssql driver, which converts string
+ concat operator from || to +.
+
Fixed ms access bug - SelectLimit() did not support ties - fixed.
+
Karsten Kraus (Karsten.Kraus#web.de), contributed error-handling code to ADONewConnection.
+ Unfortunately due to backward compat problems, had to rollback most of the changes.
+
Added new parameter to GetAssoc() to allow returning an array of key-value pairs,
+ignoring any additional columns in the recordset. Off by default.
+
Corrected mssql $conn->sysDate to return only date using convert().
+
CacheExecute() improved debugging output.
+
Changed rs2html() so newlines are converted to BR tags. Also optimized rs2html() based
+on feedback by "Jerry Workman" jerry#mtncad.com.
+
Added support for Replace() with Interbase, using DELETE and INSERT.
+
Some minor optimizations (mostly removing & references when passing arrays).
+
Changed GenID() to allows id's larger than the size of an integer.
+
Added force_session property to oci8 for better updateblob() support.
+
Fixed PageExecute() which did not work properly with sql containing GROUP BY.
+
2.12 12 June 2002
+
Added toexport.inc.php to export recordsets in CSV and tab-delimited format.
+
CachePageExecute() does not work - fixed - thx John Huong.
+
Interbase aliases not set properly in FetchField() - fixed. Thx Stefan Goethals.
+
Added cache property to adodb pager class. The number of secs to cache recordsets.
+
SQL rewriting bug in pageexecute() due to skipping of newlines due to missing /s modifier. Fixed.
+
Max size of cached recordset due to a bug was 256000 bytes. Fixed.
+
Speedup of 1st invocation of CacheExecute() by tuning code.
+
We compare $rewritesql with $sql in pageexecute code in case of rewrite failure.
+
2.11 7 June 2002
+
Fixed PageExecute() rewrite sql problem - COUNT(*) and ORDER BY don't go together with
+ mssql, access and postgres. Thx to Alexander Zhukov alex#unipack.ru
+
DB2 support for CHARACTER type added - thx John Huong huongch#bigfoot.com
+
For ado, $argProvider not properly checked. Fixed - kalimero#ngi.it
+
Added $conn->Replace() function for update with automatic insert if the record does not exist.
+ Supported by all databases except interbase.
+
2.10 4 June 2002
+
Added uniqueSort property to indicate mssql ORDER BY cols must be unique.
+
Optimized session handler by crc32 the data. We only write if session data has changed.
+
adodb_sess_read in adodb-session.php now returns ''correctly - thanks to Jorma Tuomainen, webmaster#wizactive.com
+
Mssql driver did not throw EXECUTE errors correctly because ErrorMsg() and ErrorNo() called in wrong order.
+Pointed out by Alexios Fakos. Fixed.
+
Changed ado to use client cursors. This fixes BeginTran() problems with ado.
+
Added handling of timestamp type in ado.
+
Added to ado_mssql support for insert_id() and affected_rows().
+
Added support for mssql.datetimeconvert=0, available since php 4.2.0.
+
Made UnixDate() less strict, so that the time is ignored if present.
+
Changed quote() so that it checks for magic_quotes_gpc.
+
Changed maxblobsize for odbc to default to 64000.
+
2.00 13 May 2002
+
Added drivers informix72 for pre-7.3 versions, and oci805 for
+ oracle 8.0.5, and postgres64 for postgresql 6.4 and earlier. The postgres and postgres7 drivers
+ are now identical.
+
Interbase now partially supports ADODB_FETCH_BOTH, by defaulting to ASSOC mode.
+
Proper support for blobs in mssql. Also revised blob support code
+is base class. Now UpdateBlobFile() calls UpdateBlob() for consistency.
+
Added support for changed odbc_fetch_into api in php 4.2.0
+with $conn->_has_stupid_odbc_fetch_api_change.
+
Fixed spelling of tablock locking hint in GenID( ) for mssql.
+
Added RowLock( ) to several databases, including oci8, informix, sybase, etc.
+ Fixed where error in mssql RowLock().
+
Added sysDate and sysTimeStamp properties to most database drivers. These are the sql
+functions/constants for that database that return the current date and current timestamp, and
+are useful for portable inserts and updates.
+
Support for RecordCount() caused date handling in sybase and mssql to break.
+Fixed, thanks to Toni Tunkkari, by creating derived classes for ADORecordSet_array for
+both databases. Generalized using arrayClass property. Also to support RecordCount(),
+changed metatype handling for ado drivers. Now the type returned in FetchField
+ is no longer a number, but the 1-char data type returned by MetaType.
+ At the same time, fixed a lot of date handling. Now mssql support dmy and mdy date formats.
+Also speedups in sybase and mssql with preg_match and ^ in date/timestamp handling.
+Added support in sybase and mssql for 24 hour clock in timestamps (no AM/PM).
+
Extensive revisions to informix driver - thanks to Samuel CARRIERE samuel_carriere#hotmail.com
+
Added $ok parameter to CommitTrans($ok) for easy rollbacks.
+
Fixed odbc MetaColumns and MetaTables to save and restore $ADODB_FETCH_MODE.
+
Some odbc drivers did not call the base connection class constructor. Fixed.
+
Fixed regex for GetUpdateSQL() and GetInsertSQL() to support more legal character combinations.
+
+
1.99 21 April 2002
+
Added emulated RecordCount() to all database drivers if $ADODB_COUNTRECS = true
+ (which it is by default). Inspired by Cristiano Duarte (cunha17#uol.com.br).
+
Unified stored procedure support for mssql and oci8. Parameter() and PrepareSP()
+ functions implemented.
+
Added support for SELECT FIRST in informix, modified hasTop property to support
+ this.
+
Changed csv driver to handle updates/deletes/inserts properly (when Execute() returns true).
+Bind params also work now, and raiseErrorFn with csv driver. Added csv driver to QA process.
+
Better error checking in oci8 UpdateBlob() and UpdateBlobFile().
+
Added TIME type to MySQL - patch by Manfred h9125297#zechine.wu-wien.ac.at
+
Prepare/Execute implemented for Interbase/Firebird
+
Changed some regular expressions to be anchored by /^ $/ for speed.
+
Added UnixTimeStamp() and UnixDate() to ADOConnection(). Now these functions
+ are in both ADOConnection and ADORecordSet classes.
+
Empty recordsets were not cached - fixed.
+
Thanks to Gaetano Giunta (g.giunta#libero.it) for the oci8 code review. We
+ didn't agree on everything, but i hoped we agreed to disagree!
+
1.90 6 April 2002
+
Now all database drivers support fetch modes ADODB_FETCH_NUM and ADODB_FETCH_ASSOC, though
+ still not fully tested. Eg. Frontbase, Sybase, Informix.
+
NextRecordSet() support for mssql. Contributed by "Sven Axelsson" sven.axelsson#bokochwebb.se
+
Added blob support for SQL Anywhere. Contributed by Wade Johnson wade#wadejohnson.de
+
Fixed some security loopholes in server.php. Server.php also supports fetch mode.
+
Generalized GenID() to support odbc and mssql drivers. Mssql no longer generates GUID's.
+
Experimental RowLock($table,$where) for mssql.
+
Properly implemented Prepare() in oci8 and ODBC.
+
Added Bind() support to oci8 to support Prepare().
+
Improved error handler. Catches CacheExecute() and GenID() errors now.
+
Now if you are running php from the command line, debugging messages do not output html formating.
+Not 100% complete, but getting there.
+
1.81 22 March 2002
+
Restored default $ADODB_FETCH_MODE = ADODB_FETCH_DEFAULT for backward compatibility.
+
SelectLimit for oci8 improved - Our FIRST_ROWS optimization now does not overwrite existing hint.
+
New Sybase SQL Anywhere driver. Contributed by Wade Johnson wade#wadejohnson.de
+
1.80 15 March 2002
+
Redesigned directory structure of ADOdb files. Added new driver directory where
+all database drivers reside.
+
Changed caching algorithm to create subdirectories. Now we scale better.
+
Informix driver now supports insert_id(). Contribution by "Andrea Pinnisi" pinnisi#sysnet.it
+
Added experimental ISO date and FetchField support for informix.
+
Fixed a quoting bug in Execute() with bind parameters, causing problems with blobs.
+
Mssql driver speedup by 10-15%.
+
Now in CacheExecute($secs2cache,$sql,...), $secs2cache is optional. If missing, it will
+take the value defined in $connection->cacheSecs (default is 3600 seconds). Note that
+CacheSelectLimit(), the secs2cache is still compulsory - sigh.
+
Sybase SQL Anywhere driver (using ODBC) contributed by Wade Johnson wade#wadejohnson.de
+
1.72 8 March 2002
+
Added @ when returning Fields() to prevent spurious error - "Michael William Miller" mille562#pilot.msu.edu
+
MetaDatabases() for postgres contributed by Phil pamelant#nerim.net
+
Mitchell T. Young (mitch#youngfamily.org) contributed informix driver.
+
Fixed rs2html() problem. I cannot reproduce, so probably a problem with pre PHP 4.1.0 versions,
+ when supporting new ADODB_FETCH_MODEs.
+
Mattia Rossi (mattia#technologist.com) contributed BlobDecode() and UpdateBlobFile() for postgresql
+ using the postgres specific pg_lo_import()/pg_lo_open() - i don't use them but hopefully others will
+ find this useful. See this posting
+ for an example of usage.
+
Added UpdateBlobFile() for uploading files to a database.
+
Made UpdateBlob() compatible with oci8po driver.
+
Added noNullStrings support to oci8 driver. Oracle changes all ' ' strings to nulls,
+ so you need to set strings to ' ' to prevent the nullifying of strings. $conn->noNullStrings = true;
+ will do this for you automatically. This is useful when you define a char column as NOT NULL.
+
Fixed UnixTimeStamp() bug - wasn't setting minutes and seconds properly. Patch from Agusti Fita i Borrell agusti#anglatecnic.com.
+
Toni Tunkkari added patch for sybase dates. Problem with spaces in day part of date fixed.
+
1.71 18 Jan 2002
+
Sequence start id support. Now $conn->Gen_ID('seqname', 50) to start sequence from 50.
+
CSV driver fix for selectlimit, from Andreas - akaiser#vocote.de.
+
Gam3r spotted that a global variable was undefined in the session handler.
+
Mssql date regex had error. Fixed - reported by Minh Hoang vb_user#yahoo.com.
+
DBTimeStamp() and DBDate() now accept iso dates and unix timestamps. This means
+that the PostgreSQL handling of dates in GetInsertSQL() and GetUpdateSQL() can
+be removed. Also if these functions are passed '' or null or false, we return a SQL null.
+
GetInsertSQL() and GetUpdateSQL() now accept a new parameter, $magicq to
+indicate whether quotes should be inserted based on magic quote settings - suggested by
+dj#4ict.com.
+
Reformated docs slightly based on suggestions by Chris Small.
+
1.65 28 Dec 2001
+
Fixed borland_ibase class naming bug.
+
Now instead of using $rs->fields[0] internally, we use reset($rs->fields) so
+ that we are compatible with ADODB_FETCH_ASSOC mode. Reported by Nico S.
+
Changed recordset constructor and _initrs() for oci8 so that it returns the field definitions even
+ if no rows in the recordset. Reported by Rick Hickerson (rhickers#mv.mv.com).
+
Improved support for postgresql in GetInsertSQL and GetUpdateSQL by
+ "mike" mike#partner2partner.com and "Ryan Bailey" rebel#windriders.com
+
1.64 20 Dec 2001
+
Danny Milosavljevic <danny.milo#gmx.net> added some patches for MySQL error handling
+and displaying default values.
+
Fixed some ADODB_FETCH_BOTH inconsistencies in odbc and interbase.
+
Added more tests to test suite to cover ADODB_FETCH_* and ADODB_ERROR_HANDLER.
+
Added firebird (ibase) driver
+
Added borland_ibase driver for interbase 6.5
+
1.63 13 Dec 2001
+Absolute to the adodb-lib.inc.php file not set properly. Fixed.
+
+
1.62 11 Dec 2001
+
Major speedup of ADOdb for low-end web sites by reducing the php code loading and compiling
+cycle. We conditionally compile not so common functions.
+Moved csv code to adodb-csvlib.inc.php to reduce adodb.inc.php parsing. This file
+is loaded only when the csv/proxy driver is used, or CacheExecute() is run.
+Also moved PageExecute(), GetSelectSQL() and GetUpdateSQL() core code to adodb-lib.inc.php.
+This reduced the 70K main adodb.inc.php file to 55K, and since at least 20K of the file
+is comments, we have reduced 50K of code in adodb.inc.php to 35K. There
+ should be 35% reduction in memory and thus 35% speedup in compiling the php code for the
+main adodb.inc.php file.
+
Highly tuned SelectLimit() for oci8 for massive speed improvements on large files.
+Selecting 20 rows starting from the 20,000th row of a table is now 7 times faster.
+Thx to Tomas V V Cox.
+
Allow . and # in table definitions in GetInsertSQL and GetUpdateSQL.
+ See ADODB_TABLE_REGEX constant. Thx to Ari Kuorikoski.
+
Added ADODB_PREFETCH_ROWS constant, defaulting to 10. This determines the number
+of records to prefetch in a SELECT statement. Only used by oci8.
+
Added high portability Oracle class called oci8po. This uses ? for bind variables, and
+lower cases column names.
+
Now all database drivers support $ADODB_FETCH_MODE, including interbase, ado, and odbc:
+ADODB_FETCH_NUM and ADODB_FETCH_ASSOC. ADODB_FETCH_BOTH is not fully implemented for all
+database drivers.
+
1.61 Nov 2001
+
Added PO_RecordCount() and PO_Insert_ID(). PO stands for portable. Pablo Roca
+ [pabloroca#mvps.org]
+
GenID now returns 0 if not available. Safer is that you should check $conn->hasGenID
+ for availability.
+
M'soft ADO we now correctly close recordset in _close() peterd#telephonetics.co.uk
+
MSSQL now supports GenID(). It generates a 16-byte GUID from mssql newid()
+ function.
+
Changed ereg_replace to preg_replace in SelectLimit. This is a fix for mssql.
+ Ereg doesn't support t or n! Reported by marino Carlos xaplo#postnuke-espanol.org
+
Added $recordset->connection. This is the ADOConnection object for the recordset.
+Works with cached and normal recordsets. Surprisingly, this had no affect on performance!
+
1.54 15 Nov 2001
+Fixed some more bugs in PageExecute(). I am getting sick of bug in this and will have to
+reconsider my QA here. The main issue is that I don't use PageExecute() and
+to check whether it is working requires a visual inspection of the html generated currently.
+It is possible to write a test script but it would be quite complicated :(
+
More speedups of SelectLimit() for DB2, Oci8, access, vfp, mssql.
+
+
+
1.53 7 Nov 2001
+Added support for ADODB_FETCH_ASSOC for ado and odbc drivers.
+Tuned GetRowAssoc(false) in postgresql and mysql.
+Stephen Van Dyke contributed ADOdb icon, accepted with some minor mods.
+Enabled Affected_Rows() for postgresql
+Speedup for Concat() using implode() - Benjamin Curtis ben_curtis#yahoo.com
+Fixed some more bugs in PageExecute() to prevent infinite loops
+
1.52 5 Nov 2001
+Spelling error in CacheExecute() caused it to fail. $ql should be $sql in line 625!
+Added fixes for parsing [ and ] in GetUpdateSQL().
+
1.51 5 Nov 2001
+
Oci8 SelectLimit() speedup by using OCIFetch().
+
Oci8 was mistakenly reporting errors when $db->debug = true.
+
If a connection failed with ODBC, it was not correctly reported - fixed.
+
_connectionID was inited to -1, changed to false.
+
Added $rs->FetchRow(), to simplify API, ala PEAR DB
+
Added PEAR DB compat mode, which is still faster than PEAR! See adodb-pear.inc.php.
+
Removed postgres pconnect debugging statement.
+
1.50 31 Oct 2001
+
ADOdbConnection renamed to ADOConnection, and ADOdbFieldObject to ADOFieldObject.
+
PageExecute() now checks for empty $rs correctly, and the errors in the docs on this subject have been fixed.
+
odbc_error() does not return 6 digit error correctly at times. Implemented workaround.
+
Added ADORecordSet_empty class. This will speedup INSERTS/DELETES/UPDATES because the return
+object created is much smaller.
+
Added Prepare() to odbc, and oci8 (but doesn't work properly for oci8 still).
+
Made pgsql a synonym for postgre7, and changed SELECT LIMIT to use OFFSET for compat with
+postgres 7.2.
+
Revised adodb-cryptsession.php thanks to Ari.
+
Set resources to false on _close, to force freeing of resources.
+
Added adodb-errorhandler.inc.php, adodb-errorpear.inc.php and raiseErrorFn on Freek's urging.
+
GetRowAssoc($toUpper=true): $toUpper added as default.
+
Errors when connecting to a database were not captured formerly. Now we do it correctly.
+
1.40 19 September 2001
+
PageExecute() to implement page scrolling added. Code and idea by Iván Oliva.
+
Some minor postgresql fixes.
+
Added sequence support using GenID() for postgresql, oci8, mysql, interbase.
+
Added UpdateBlob support for interbase (untested).
+
Added encrypted sessions (see adodb-cryptsession.php). By Ari Kuorikoski <kuoriari#finebyte.com>
+
1.31 21 August 2001
+
Many bug fixes thanks to "GaM3R (Cameron)" <gamr#outworld.cx>. Some session changes due to Gam3r.
+
Fixed qstr() to quote also.
+
rs2html() now pretty printed.
+
Jonathan Younger jyounger#unilab.com contributed the great idea GetUpdateSQL() and GetInsertSQL() which
+generates SQL to update and insert into a table from a recordset. Modify the recordset fields
+array, then can this function to generate the SQL (the SQL is not executed).
+
"Nicola Fankhauser" <nicola.fankhauser#couniq.com> found some bugs in date handling for mssql.
+
Added minimal Oracle support for LOBs. Still under development.
+Added $ADODB_FETCH_MODE so you can control whether recordsets return arrays which are
+numeric, associative or both. This is a global variable you set. Currently only MySQL, Oci8, Postgres
+drivers support this.
+
PostgreSQL properly closes recordsets now. Reported by several people.
+
+Added UpdateBlob() for Oracle. A hack to make it easier to save blobs.
+
+Oracle timestamps did not display properly. Fixed.
+
1.20 6 June 2001
+
Now Oracle can connect using tnsnames.ora or server and service name
+
Extensive Oci8 speed optimizations.
+Oci8 code revised to support variable binding, and /*+ FIRST_ROWS */ hint.
+
Worked around some 4.0.6 bugs in odbc_fetch_into().
+
Paolo S. Asioli paolo.asioli#libero.it suggested GetRowAssoc().
+
Escape quotes for oracle wrongly set to '. Now '' is used.
+
Variable binding now works in ODBC also.
+
Jumped to version 1.20 because I don't like 13 :-)
+
1.12 6 June 2001
+
Changed $ADODB_DIR to ADODB_DIR constant to plug a security loophole.
+
Changed _close() to close persistent connections also. Prevents connection leaks.
+
Major revision of oracle and oci8 drivers.
+Added OCI_RETURN_NULLS and OCI_RETURN_LOBS to OCIFetchInto(). BLOB, CLOB and VARCHAR2 recognition
+in MetaType() improved. MetaColumns() returns columns in correct sort order.
+
Interbase timestamp input format was wrong. Fixed.
+
1.11 20 May 2001
+
Improved file locking for Windows.
+
Probabilistic flushing of cache to avoid avalanche updates when cache timeouts.
+
Cached recordset timestamp not saved in some scenarios. Fixed.
+
1.10 19 May 2001
+
Added caching. CacheExecute() and CacheSelectLimit().
+
Fixed SelectLimit(), SELECT TOP not working under certain circumstances.
+
Added better Frontbase support of MetaTypes() by Frank M. Kromann.
+
1.01 24 April 2001
+
Fixed SelectLimit bug. not quoted properly.
+
SelectLimit: SELECT TOP -1 * FROM TABLE not support by Microsoft. Fixed.
+
GetMenu improved by glen.davies#cce.ac.nz to support multiple hilited items
+
FetchNextObject() did not work with only 1 record returned. Fixed bug reported by $tim#orotech.net
+
Fixed mysql field max_length problem. Fix suggested by Jim Nicholson (jnich#att.com)
+
1.00 16 April 2001
+
Given some brilliant suggestions on how to simplify ADOdb by akul. You no longer need to
+setup $ADODB_DIR yourself, and ADOLoadCode() is automatically called by ADONewConnection(),
+simplifying the startup code.
+
FetchNextObject() added. Suggested by Jakub Marecek. This makes FetchObject() obsolete, as
+this is more flexible and powerful.
+
Misc fixes to SelectLimit() to support Access (top must follow distinct) and Fields()
+in the array recordset. From Reinhard Balling.
+
0.96 27 Mar 2001
+
ADOConnection Close() did not return a value correctly. Thanks to akul#otamedia.com.
+
When the horrible magic_quotes is enabled, back-slash () is changed to double-backslash (\).
+This doesn't make sense for Microsoft/Sybase databases. We fix this in qstr().
+
Fixed Sybase date problem in UnixDate() thanks to Toni Tunkkari. Also fixed MSSQL problem
+in UnixDate() - thanks to milhouse31#hotmail.com.
+
MoveNext() moved to leaf classes for speed in MySQL/PostgreSQL. 10-15% speedup.
+
Added null handling in bindInputArray in Execute() -- Ron Baldwin suggestion.
+
Fixed some option tags. Thanks to john#jrmstudios.com.
+
0.95 13 Mar 2001
+
Added postgres7 database driver which supports LIMIT and other version 7 stuff in the future.
+
Added SelectLimit to ADOConnection to simulate PostgreSQL's "select * from table limit 10 offset 3".
+Added helper function GetArrayLimit() to ADORecordSet.
+
Fixed mysql metacolumns bug. Thanks to Freek Dijkstra (phpeverywhere#macfreek.com).
+
Also many PostgreSQL changes by Freek. He almost rewrote the whole PostgreSQL driver!
+
Added fix to input parameters in Execute for non-strings by Ron Baldwin.
+
Added new metatype, X for TeXt. Formerly, metatype B for Blob also included
+text fields. Now 'B' is for binary/image data. 'X' for textual data.
+
Fixed $this->GetArray() in GetRows().
+
Oracle and OCI8: 1st parameter is always blank -- now warns if it is filled.
+
Now hasLimit and hasTop added to indicate whether
+SELECT * FROM TABLE LIMIT 10 or SELECT TOP 10 * FROM TABLE are supported.
+
0.94 04 Feb 2001
+
Added ADORecordSet::GetRows() for compatibility with Microsoft ADO. Synonym for GetArray().
+
Added new metatype 'R' to represent autoincrement numbers.
+
Added ADORecordSet.FetchObject() to return a row as an object.
+
Finally got a Linux box to test PostgreSql. Many fixes.
+
Fixed copyright misspellings in 0.93.
+
Fixed mssql MetaColumns type bug.
+
Worked around odbc bug in PHP4 for sessions.
+
Fixed many documentation bugs (affected_rows, metadatabases, qstr).
+
Fixed MySQL timestamp format (removed comma).
+
Interbase driver did not call ibase_pconnect(). Fixed.
+
0.93 18 Jan 2002
+
Fixed GetMenu bug.
+
Simplified Interbase commit and rollback.
+
Default behaviour on closing a connection is now to rollback all active transactions.
+
Added field object handling for array recordset for future XML compatibility.
+
Added arr2html() to convert array to html table.
+
0.92 2 Jan 2002
+
Interbase Commit and Rollback should be working again.
+
Changed initialisation of ADORecordSet. This is internal and should not affect users. We
+are doing this to support cached recordsets in the future.
+
+
Implemented ADORecordSet_array class. This allows you to simulate a database recordset
+with an array.
+
Added UnixDate() and UnixTimeStamp() to ADORecordSet.
+
0.91 21 Dec 2000
+
Fixed ODBC so ErrorMsg() is working.
+
Worked around ADO unrecognised null (0x1) value problem in COM.
+
Added Sybase support for FetchField() type
+
Removed debugging code and unneeded html from various files
+
Changed to javadoc style comments to adodb.inc.php.
+
Added maxsql as synonym for mysqlt
+
Now ODBC downloads first 8K of blob by default
+
0.90 15 Nov 2000
+
Lots of testing of Microsoft ADO. Should be more stable now.
+
Added $ADODB_COUNTREC. Set to false for high speed selects.
+
Added Sybase support. Contributed by Toni Tunkkari (toni.tunkkari#finebyte.com). Bug in Sybase
+ API: GetFields is unable to determine date types.
+
Changed behaviour of RecordSet.GetMenu() to support size parameter (listbox) properly.
+
Added emptyDate and emptyTimeStamp to RecordSet class that defines how to represent
+ empty dates.
+
Added MetaColumns($table) that returns an array of ADOFieldObject's listing
+ the columns of a table.
+
Added transaction support for PostgresSQL -- thanks to "Eric G. Werk" egw#netguide.dk.
+
Added adodb-session.php for session support.
+
0.80 30 Nov 2000
+
Added support for charSet for interbase. Implemented MetaTables for most databases.
+ PostgreSQL more extensively tested.
+
0.71 22 Nov 2000
+
Switched from using require_once to include/include_once for backward compatability with PHP 4.02 and earlier.
+
0.70 15 Nov 2000
+
Calls by reference have been removed (call_time_pass_reference=Off) to ensure compatibility with future versions of PHP,
+except in Oracle 7 driver due to a bug in php_oracle.dll.
+
PostgreSQL database driver contributed by Alberto Cerezal (acerezalp#dbnet.es).
+
+
Oci8 driver for Oracle 8 contributed by George Fourlanos (fou#infomap.gr).
+
Added mysqlt database driver to support MySQL 3.23 which has transaction
+ support.
+
Oracle default date format (DD-MON-YY) did not match ADOdb default date format (which is YYYY-MM-DD). Use ALTER SESSION to force the default date.
+
Error message checking is now included in test suite.
+
MoveNext() did not check EOF properly -- fixed.
+
0.60 Nov 8 2000
+
Fixed some constructor bugs in ODBC and ADO. Added ErrorNo function to ADOConnection
+ class.
+
0.51 Oct 18 2000
+
Fixed some interbase bugs.
+
0.50 Oct 16 2000
+
Interbase commit/rollback changed to be compatible with PHP 4.03.
+
CommitTrans( ) will now return true if transactions not supported.
+
Conversely RollbackTrans( ) will return false if transactions not supported.
+
+
0.46 Oct 12
+Many Oracle compatibility issues fixed.
+
0.40 Sept 26
+
Many bug fixes
+
Now Code for BeginTrans, CommitTrans and RollbackTrans is working. So is the Affected_Rows
+and Insert_ID. Added above functions to test.php.
+
ADO type handling was busted in 0.30. Fixed.
+
Generalised Move( ) so it works will all databases, including ODBC.
+
0.30 Sept 18
+
Renamed ADOLoadDB to ADOLoadCode. This is clearer.
+
Added BeginTrans, CommitTrans and RollbackTrans functions.
+
Added Affected_Rows() and Insert_ID(), _affectedrows() and _insertID(), ListTables(),
+ ListDatabases(), ListColumns().
+
Need to add New_ID() and hasInsertID and hasAffectedRows, autoCommit
+
0.20 Sept 12
+
Added support for Microsoft's ADO.
+
Added new field to ADORecordSet -- canSeek
+
Added new parameter to _fetch($ignore_fields = false). Setting to true will
+ not update fields array for faster performance.
+
Added new field to ADORecordSet/ADOConnection -- dataProvider to indicate whether
+ a class is derived from odbc or ado.
+
Changed class ODBCFieldObject to ADOFieldObject -- not documented currently.
+
Added benchmark.php and testdatabases.inc.php to the test suite.
+
Added to ADORecordSet FastForward( ) for future high speed scrolling. Not documented.
\ No newline at end of file
diff --git a/restrict/plugins/DBMapping/data/adodb5/docs/readme.htm b/restrict/plugins/DBMapping/data/adodb5/docs/readme.htm
index 4780cb7..e2c0bb5 100755
--- a/restrict/plugins/DBMapping/data/adodb5/docs/readme.htm
+++ b/restrict/plugins/DBMapping/data/adodb5/docs/readme.htm
@@ -1,68 +1,68 @@
-
-
-ADODB Manual
-
-
-
-
-
-
ADOdb Library for PHP
-
ADOdb is a suite of database libraries that allow you to connect to multiple
- databases in a portable manner. Download from http://adodb.sourceforge.net/.
-
The ADOdb documentation has moved to docs-adodb.htm
- This allows you to query, update and insert records using a portable API.
-
The ADOdb data dictionary docs are at docs-datadict.htm.
- This allows you to create database tables and indexes in a portable manner.
-
The ADOdb database performance monitoring docs are at docs-perf.htm.
- This allows you to perform health checks, tune and monitor your database.
-
The ADOdb database-backed session docs are at docs-session.htm.
-
-
-
Installation
-Make sure you are running PHP4.0.4 or later. Unpack all the files into a directory accessible by your webserver.
-
-To test, try modifying some of the tutorial examples. Make sure you customize the connection settings correctly. You can debug using:
-
-Here are some examples of how people are using ADOdb:
-
-
PhpLens is a commercial data grid component that allows
- both cool Web designers and serious unshaved programmers to develop and
- maintain databases on the Web easily. Developed by the author of ADOdb.
-
-
PHAkt: PHP Extension for DreamWeaver Ultradev allows
- you to script PHP in the popular Web page editor. Database handling provided
- by ADOdb.
-
Analysis Console for Intrusion Databases (ACID): PHP-based
- analysis engine to search and process a database of security incidents
- generated by security-related software such as IDSes and firewalls (e.g.
- Snort, ipchains). By Roman Danyliw.
-
PostNuke is a very popular free content management system
- and weblog system. It offers full CSS support, HTML 4.01 transitional
- compliance throughout, an advanced blocks system, and is fully multi-lingual
- enabled.
-
EasyPublish CMS is another free content management system
- for managing information and integrated modules on your internet, intranet-
- and extranet-sites. From Norway.
-
NOLA is a full featured accounting, inventory, and job
- tracking application. It is licensed under the GPL, and developed by Noguska.
-
-
-
-
+
+
+ADODB Manual
+
+
+
+
+
+
ADOdb Library for PHP
+
ADOdb is a suite of database libraries that allow you to connect to multiple
+ databases in a portable manner. Download from http://adodb.sourceforge.net/.
+
The ADOdb documentation has moved to docs-adodb.htm
+ This allows you to query, update and insert records using a portable API.
+
The ADOdb data dictionary docs are at docs-datadict.htm.
+ This allows you to create database tables and indexes in a portable manner.
+
The ADOdb database performance monitoring docs are at docs-perf.htm.
+ This allows you to perform health checks, tune and monitor your database.
+
The ADOdb database-backed session docs are at docs-session.htm.
+
+
+
Installation
+Make sure you are running PHP4.0.4 or later. Unpack all the files into a directory accessible by your webserver.
+
+To test, try modifying some of the tutorial examples. Make sure you customize the connection settings correctly. You can debug using:
+
+Here are some examples of how people are using ADOdb:
+
+
PhpLens is a commercial data grid component that allows
+ both cool Web designers and serious unshaved programmers to develop and
+ maintain databases on the Web easily. Developed by the author of ADOdb.
+
+
PHAkt: PHP Extension for DreamWeaver Ultradev allows
+ you to script PHP in the popular Web page editor. Database handling provided
+ by ADOdb.
+
Analysis Console for Intrusion Databases (ACID): PHP-based
+ analysis engine to search and process a database of security incidents
+ generated by security-related software such as IDSes and firewalls (e.g.
+ Snort, ipchains). By Roman Danyliw.
+
PostNuke is a very popular free content management system
+ and weblog system. It offers full CSS support, HTML 4.01 transitional
+ compliance throughout, an advanced blocks system, and is fully multi-lingual
+ enabled.
+
EasyPublish CMS is another free content management system
+ for managing information and integrated modules on your internet, intranet-
+ and extranet-sites. From Norway.
+
NOLA is a full featured accounting, inventory, and job
+ tracking application. It is licensed under the GPL, and developed by Noguska.
+
+
+
+
diff --git a/restrict/plugins/DBMapping/data/adodb5/docs/tips_portable_sql.htm b/restrict/plugins/DBMapping/data/adodb5/docs/tips_portable_sql.htm
index aa75069..685749c 100755
--- a/restrict/plugins/DBMapping/data/adodb5/docs/tips_portable_sql.htm
+++ b/restrict/plugins/DBMapping/data/adodb5/docs/tips_portable_sql.htm
@@ -1,367 +1,367 @@
-
-
-
-
- Tips on Writing Portable SQL for Multiple Databases for PHP
-
-
-
-
-
- If you are writing an application that is used in multiple environments and
- operating systems, you need to plan to support multiple databases. This article
- is based on my experiences with multiple database systems, stretching from 4th
- Dimension in my Mac days, to the databases I currently use, which are: Oracle,
- FoxPro, Access, MS SQL Server and MySQL. Although most of the advice here applies
- to using SQL with Perl, Python and other programming languages, I will focus on PHP and how
- the ADOdb database abstraction library
- offers some solutions.
-
Most database vendors practice product lock-in. The best or fastest way to
- do things is often implemented using proprietary extensions to SQL. This makes
- it extremely hard to write portable SQL code that performs well under all conditions.
- When the first ANSI committee got together in 1984 to standardize SQL, the database
- vendors had such different implementations that they could only agree on the
- core functionality of SQL. Many important application specific requirements
- were not standardized, and after so many years since the ANSI effort began,
- it looks as if much useful database functionality will never be standardized.
- Even though ANSI-92 SQL has codified much more, we still have to implement portability
- at the application level.
-
Selects
-
The SELECT statement has been standardized to a great degree. Nearly every
- database supports the following:
-
SELECT [cols] FROM [tables]
- [WHERE conditions]
- [GROUP BY cols]
- [HAVING conditions]
- [ORDER BY cols]
-
But so many useful techniques can only be implemented by using proprietary
- extensions. For example, when writing SQL to retrieve the first 10 rows for
- paging, you could write...
-
-
-
Database
-
SQL Syntax
-
-
-
DB2
-
select * from table fetch first 10 rows only
-
-
-
Informix
-
select first 10 * from table
-
-
-
Microsoft SQL Server and Access
-
select top 10 * from table
-
-
-
MySQL and PostgreSQL
-
select * from table limit 10
-
-
-
Oracle 8i
-
select * from (select * from table) where rownum <= 10
-
-
-
This feature of getting a subset of data is so useful that in the PHP class
- library ADOdb, we have a SelectLimit( ) function that allows you to hide the
- implementation details within a function that will rewrite your SQL for you:
-
$connection->SelectLimit('select * from table', 10);
-
-
Selects: Fetch Modes
-
PHP allows you to retrieve database records as arrays. You can choose to have
- the arrays indexed by field name or number. However different low-level PHP
- database drivers are inconsistent in their indexing efforts. ADOdb allows you
- to determine your prefered mode. You set this by setting the variable $ADODB_FETCH_MODE
- to either of the constants ADODB_FETCH_NUM (for numeric indexes) or ADODB_FETCH_ASSOC
- (using field names as an associative index).
-
The default behaviour of ADOdb varies depending on the database you are using.
- For consistency, set the fetch mode to either ADODB_FETCH_NUM (for speed) or
- ADODB_FETCH_ASSOC (for convenience) at the beginning of your code.
-
Selects: Counting Records
-
Another problem with SELECTs is that some databases do not return the number
- of rows retrieved from a select statement. This is because the highest performance
- databases will return records to you even before the last record has been found.
-
-
In ADOdb, RecordCount( ) returns the number of rows returned, or will emulate
- it by buffering the rows and returning the count after all rows have been returned.
- This can be disabled for performance reasons when retrieving large recordsets
- by setting the global variable $ADODB_COUNTRECS = false. This variable is checked
- every time a query is executed, so you can selectively choose which recordsets
- to count.
-
If you prefer to set $ADODB_COUNTRECS = false, ADOdb still has the PO_RecordCount(
- ) function. This will return the number of rows, or if it is not found, it will
- return an estimate using SELECT COUNT(*):
-
$rs = $db->Execute("select * from table where state=$state");
-$numrows = $rs->PO_RecordCount('table', "state=$state");
-
Selects: Locking
-
SELECT statements are commonly used to implement row-level locking of tables.
- Other databases such as Oracle, Interbase, PostgreSQL and MySQL with InnoDB
- do not require row-level locking because they use versioning to display data
- consistent with a specific point in time.
-
Currently, I recommend encapsulating the row-level locking in a separate function,
- such as RowLock($table, $where):
if ($ok) $connection->CommitTrans( );
-else $connection->RollbackTrans( );
-
-
Selects: Outer Joins
-
Not all databases support outer joins. Furthermore the syntax for outer joins
- differs dramatically between database vendors. One portable (and possibly slower)
- method of implementing outer joins is using UNION.
-
For example, an ANSI-92 left outer join between two tables t1 and t2 could
- look like:
-
SELECT t1.col1, t1.col2, t2.cola FROM t1 LEFT JOIN t2 ON t1.col = t2.col
-
This can be emulated using:
-
SELECT t1.col1, t1.col2, t2.cola FROM t1, t2 WHERE t1.col = t2.col
- UNION ALL
-SELECT col1, col2, null FROM t1 WHERE t1.col not in (select distinct col from t2)
-
-
Since ADOdb 2.13, we provide some hints in the connection object as to legal
- join variations. This is still incomplete and sometimes depends on the database
- version you are using, but is useful as a general guideline:
-
$conn->leftOuter: holds the
- operator used for left outer joins (eg. '*='), or false if not known or not
- available.
- $conn->rightOuter: holds the
- operator used for right outer joins (eg '=*'), or false if not known or not
- available.
- $conn->ansiOuter: boolean
- that if true means that ANSI-92 style outer joins are supported, or false if
- not known.
-
Inserts
-
When you create records, you need to generate unique id's for each record.
- There are two common techniques: (1) auto-incrementing columns and (2) sequences.
-
-
Auto-incrementing columns are supported by MySQL, Sybase and Microsoft Access
- and SQL Server. However most other databases do not support this feature. So
- for portability, you have little choice but to use sequences. Sequences are
- special functions that return a unique incrementing number every time you call
- it, suitable to be used as database keys. In ADOdb, we use the GenID( ) function.
- It has takes a parameter, the sequence name. Different tables can have different
- sequences.
For databases that do not support sequences natively, ADOdb emulates sequences
- by creating a table for every sequence.
-
Binding
-
Binding variables in an SQL statement is another tricky feature. Binding is
- useful because it allows pre-compilation of SQL. When inserting multiple records
- into a database in a loop, binding can offer a 50% (or greater) speedup. However
- many databases such as Access and MySQL do not support binding natively and
- there is some overhead in emulating binding. Furthermore, different databases
- (specificly Oracle!) implement binding differently. My recommendation is to
- use binding if your database queries are too slow, but make sure you are using
- a database that supports it like Oracle.
-
ADOdb supports portable Prepare/Execute with:
-
$stmt = $db->Prepare('select * from customers where custid=? and state=?');
-$rs = $db->Execute($stmt, array($id,'New York'));
-
Oracle uses named bind placeholders, not "?", so to support portable binding, we have Param() that generates
-the correct placeholder (available since ADOdb 3.92):
-
$sql = 'insert into table (col1,col2) values ('.$DB->Param('a').','.$DB->Param('b').')';
-# generates 'insert into table (col1,col2) values (?,?)'
-# or 'insert into table (col1,col2) values (:a,:b)'
-$stmt = $DB->Prepare($sql);
-$stmt = $DB->Execute($stmt,array('one','two'));
-
-
-
Portable Native SQL
-
ADOdb provides the following functions for portably generating SQL functions
- as strings to be merged into your SQL statements (some are only available since
- ADOdb 3.92):
-
-
-
Function
-
Description
-
-
-
DBDate($date)
-
Pass in a UNIX timestamp or ISO date and it will convert it to a date
- string formatted for INSERT/UPDATE
-
-
-
DBTimeStamp($date)
-
Pass in a UNIX timestamp or ISO date and it will convert it to a timestamp
- string formatted for INSERT/UPDATE
-
-
-
SQLDate($date, $fmt)
-
Portably generate a date formatted using $fmt mask, for use in SELECT
- statements.
-
-
-
OffsetDate($date, $ndays)
-
Portably generate a $date offset by $ndays.
-
-
-
Concat($s1, $s2, ...)
-
Portably concatenate strings. Alternatively, for mssql use mssqlpo driver,
- which allows || operator.
-
-
-
IfNull($fld, $replaceNull)
-
Returns a string that is the equivalent of MySQL IFNULL or Oracle NVL.
-
-
-
Param($name)
-
Generates bind placeholders, using ? or named conventions as appropriate.
-
-
$db->sysDate
Property that holds the SQL function that returns today's date
-
-
$db->sysTimeStamp
Property that holds the SQL function that returns the current
-timestamp (date+time).
-
-
-
-
$db->concat_operator
Property that holds the concatenation operator
-
-
-
$db->length
Property that holds the name of the SQL strlen function.
-
-
-
$db->upperCase
Property that holds the name of the SQL strtoupper function.
-
-
$db->random
Property that holds the SQL to generate a random number between 0.00 and 1.00.
-
-
-
$db->substr
Property that holds the name of the SQL substring function.
-
-
-
-
DDL and Tuning
-There are database design tools such as ERWin or Dezign that allow you to generate data definition language commands such as ALTER TABLE or CREATE INDEX from Entity-Relationship diagrams.
-
-However if you prefer to use a PHP-based table creation scheme, adodb provides you with this feature. Here is the code to generate the SQL to create a table with:
-
-
Auto-increment primary key 'ID',
-
The person's 'NAME' VARCHAR(32) NOT NULL and defaults to '',
-
The date and time of record creation 'CREATED',
-
The person's 'AGE', defaulting to 0, type NUMERIC(16).
-
-
-Also create a compound index consisting of 'NAME' and 'AGE':
-
-$datadict = NewDataDictionary($connection);
-$flds = "
- ID I AUTOINCREMENT PRIMARY,
- NAME C(32) DEFAULT '' NOTNULL,
- CREATED T DEFTIMESTAMP,
- AGE N(16) DEFAULT 0
-";
-$sql1 = $datadict->CreateTableSQL('tabname', $flds);
-$sql2 = $datadict->CreateIndexSQL('idx_name_age', 'tabname', 'NAME,AGE');
-
-
-
Data Types
-
Stick to a few data types that are available in most databases. Char, varchar
- and numeric/number are supported by most databases. Most other data types (including
- integer, boolean and float) cannot be relied on being available. I recommend
- using char(1) or number(1) to hold booleans.
-
Different databases have different ways of representing dates and timestamps/datetime.
- ADOdb attempts to display all dates in ISO (YYYY-MM-DD) format. ADOdb also provides
- DBDate( ) and DBTimeStamp( ) to convert dates to formats that are acceptable
- to that database. Both functions accept Unix integer timestamps and date strings
- in ISO format.
We also provide functions to convert database dates to Unix timestamps:
-
$unixts = $recordset->UnixDate('#2002-02-30#'); # MS Access date =gt; unix timestamp
-
For date calculations, we have OffsetDate which allows you to calculate dates such as yesterday and next week in a RDBMS independant fashion. For example, if we want to set a field to 6 hour from now, use:
-
-$sql = 'update table set dtimefld='.$db->OffsetDate($db->sysTimeStamp, 6/24).' where ...';
-
-
The maximum length of a char/varchar field is also database specific. You can
- only assume that field lengths of up to 250 characters are supported. This is
- normally impractical for web based forum or content management systems. You
- will need to be familiar with how databases handle large objects (LOBs). ADOdb
- implements two functions, UpdateBlob( ) and UpdateClob( ) that allow you to
- update fields holding Binary Large Objects (eg. pictures) and Character Large
- Objects (eg. HTML articles):
-
# for oracle
-$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1,empty_blob())');
-$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');
-
-# non-oracle databases
-$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
-$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');
-
-
Null handling is another area where differences can occur. This is a mine-field,
- because 3-value logic is tricky.
-
In general, I avoid using nulls except for dates and default all my numeric
- and character fields to 0 or the empty string. This maintains consistency with
- PHP, where empty strings and zero are treated as equivalent, and avoids SQL
- ambiguities when you use the ANY and EXISTS operators. However if your database
- has significant amounts of missing or unknown data, using nulls might be a good
- idea.
-
- ADOdb also supports a portable IfNull function, so you can define what to display
- if the field contains a null.
-
Stored Procedures
-
Stored procedures are another problem area. Some databases allow recordsets
- to be returned in a stored procedure (Microsoft SQL Server and Sybase), and
- others only allow output parameters to be returned. Stored procedures sometimes
- need to be wrapped in special syntax. For example, Oracle requires such code
- to be wrapped in an anonymous block with BEGIN and END. Also internal sql operators
- and functions such as +, ||, TRIM( ), SUBSTR( ) or INSTR( ) vary between vendors.
-
-
An example of how to call a stored procedure with 2 parameters and 1 return
- value follows:
As you can see, the ADOdb API is the same for both databases. But the stored
- procedure SQL syntax is quite different between databases and is not portable,
- so be forewarned! However sometimes you have little choice as some systems only
- allow data to be accessed via stored procedures. This is when the ultimate portability
- solution might be the only solution: treating portable SQL as a localization
- exercise...
-
SQL as a Localization Exercise
-
In general to provide real portability, you will have to treat SQL coding
- as a localization exercise. In PHP, it has become common to define separate
- language files for English, Russian, Korean, etc. Similarly, I would suggest
- you have separate Sybase, Intebase, MySQL, etc files, and conditionally include
- the SQL based on the database. For example, each MySQL SQL statement would be
- stored in a separate variable, in a file called 'mysql-lang.inc.php'.
-
$sqlGetPassword = 'select password from users where userid=%s';
-$sqlSearchKeyword = quot;SELECT * FROM articles WHERE match (title,body) against (%s)";
-
In our main PHP file:
-
# define which database to load...
-$database = 'mysql';
-include_once("$database-lang.inc.php");
-
-$db = NewADOConnection($database);
-$db->PConnect(...) or die('Failed to connect to database');
-
-# search for a keyword $word
-$rs = $db->Execute(sprintf($sqlSearchKeyWord,$db->qstr($word)));
-
Note that we quote the $word variable using the qstr( ) function. This is because
- each database quotes strings using different conventions.
-
-
Final Thoughts
-
The best way to ensure that you have portable SQL is to have your data tables designed using
-sound principles. Learn the theory of normalization and entity-relationship diagrams and model
-your data carefully. Understand how joins and indexes work and how they are used to tune performance.
-
+
+ If you are writing an application that is used in multiple environments and
+ operating systems, you need to plan to support multiple databases. This article
+ is based on my experiences with multiple database systems, stretching from 4th
+ Dimension in my Mac days, to the databases I currently use, which are: Oracle,
+ FoxPro, Access, MS SQL Server and MySQL. Although most of the advice here applies
+ to using SQL with Perl, Python and other programming languages, I will focus on PHP and how
+ the ADOdb database abstraction library
+ offers some solutions.
+
Most database vendors practice product lock-in. The best or fastest way to
+ do things is often implemented using proprietary extensions to SQL. This makes
+ it extremely hard to write portable SQL code that performs well under all conditions.
+ When the first ANSI committee got together in 1984 to standardize SQL, the database
+ vendors had such different implementations that they could only agree on the
+ core functionality of SQL. Many important application specific requirements
+ were not standardized, and after so many years since the ANSI effort began,
+ it looks as if much useful database functionality will never be standardized.
+ Even though ANSI-92 SQL has codified much more, we still have to implement portability
+ at the application level.
+
Selects
+
The SELECT statement has been standardized to a great degree. Nearly every
+ database supports the following:
+
SELECT [cols] FROM [tables]
+ [WHERE conditions]
+ [GROUP BY cols]
+ [HAVING conditions]
+ [ORDER BY cols]
+
But so many useful techniques can only be implemented by using proprietary
+ extensions. For example, when writing SQL to retrieve the first 10 rows for
+ paging, you could write...
+
+
+
Database
+
SQL Syntax
+
+
+
DB2
+
select * from table fetch first 10 rows only
+
+
+
Informix
+
select first 10 * from table
+
+
+
Microsoft SQL Server and Access
+
select top 10 * from table
+
+
+
MySQL and PostgreSQL
+
select * from table limit 10
+
+
+
Oracle 8i
+
select * from (select * from table) where rownum <= 10
+
+
+
This feature of getting a subset of data is so useful that in the PHP class
+ library ADOdb, we have a SelectLimit( ) function that allows you to hide the
+ implementation details within a function that will rewrite your SQL for you:
+
$connection->SelectLimit('select * from table', 10);
+
+
Selects: Fetch Modes
+
PHP allows you to retrieve database records as arrays. You can choose to have
+ the arrays indexed by field name or number. However different low-level PHP
+ database drivers are inconsistent in their indexing efforts. ADOdb allows you
+ to determine your prefered mode. You set this by setting the variable $ADODB_FETCH_MODE
+ to either of the constants ADODB_FETCH_NUM (for numeric indexes) or ADODB_FETCH_ASSOC
+ (using field names as an associative index).
+
The default behaviour of ADOdb varies depending on the database you are using.
+ For consistency, set the fetch mode to either ADODB_FETCH_NUM (for speed) or
+ ADODB_FETCH_ASSOC (for convenience) at the beginning of your code.
+
Selects: Counting Records
+
Another problem with SELECTs is that some databases do not return the number
+ of rows retrieved from a select statement. This is because the highest performance
+ databases will return records to you even before the last record has been found.
+
+
In ADOdb, RecordCount( ) returns the number of rows returned, or will emulate
+ it by buffering the rows and returning the count after all rows have been returned.
+ This can be disabled for performance reasons when retrieving large recordsets
+ by setting the global variable $ADODB_COUNTRECS = false. This variable is checked
+ every time a query is executed, so you can selectively choose which recordsets
+ to count.
+
If you prefer to set $ADODB_COUNTRECS = false, ADOdb still has the PO_RecordCount(
+ ) function. This will return the number of rows, or if it is not found, it will
+ return an estimate using SELECT COUNT(*):
+
$rs = $db->Execute("select * from table where state=$state");
+$numrows = $rs->PO_RecordCount('table', "state=$state");
+
Selects: Locking
+
SELECT statements are commonly used to implement row-level locking of tables.
+ Other databases such as Oracle, Interbase, PostgreSQL and MySQL with InnoDB
+ do not require row-level locking because they use versioning to display data
+ consistent with a specific point in time.
+
Currently, I recommend encapsulating the row-level locking in a separate function,
+ such as RowLock($table, $where):
if ($ok) $connection->CommitTrans( );
+else $connection->RollbackTrans( );
+
+
Selects: Outer Joins
+
Not all databases support outer joins. Furthermore the syntax for outer joins
+ differs dramatically between database vendors. One portable (and possibly slower)
+ method of implementing outer joins is using UNION.
+
For example, an ANSI-92 left outer join between two tables t1 and t2 could
+ look like:
+
SELECT t1.col1, t1.col2, t2.cola FROM t1 LEFT JOIN t2 ON t1.col = t2.col
+
This can be emulated using:
+
SELECT t1.col1, t1.col2, t2.cola FROM t1, t2 WHERE t1.col = t2.col
+ UNION ALL
+SELECT col1, col2, null FROM t1 WHERE t1.col not in (select distinct col from t2)
+
+
Since ADOdb 2.13, we provide some hints in the connection object as to legal
+ join variations. This is still incomplete and sometimes depends on the database
+ version you are using, but is useful as a general guideline:
+
$conn->leftOuter: holds the
+ operator used for left outer joins (eg. '*='), or false if not known or not
+ available.
+ $conn->rightOuter: holds the
+ operator used for right outer joins (eg '=*'), or false if not known or not
+ available.
+ $conn->ansiOuter: boolean
+ that if true means that ANSI-92 style outer joins are supported, or false if
+ not known.
+
Inserts
+
When you create records, you need to generate unique id's for each record.
+ There are two common techniques: (1) auto-incrementing columns and (2) sequences.
+
+
Auto-incrementing columns are supported by MySQL, Sybase and Microsoft Access
+ and SQL Server. However most other databases do not support this feature. So
+ for portability, you have little choice but to use sequences. Sequences are
+ special functions that return a unique incrementing number every time you call
+ it, suitable to be used as database keys. In ADOdb, we use the GenID( ) function.
+ It has takes a parameter, the sequence name. Different tables can have different
+ sequences.
For databases that do not support sequences natively, ADOdb emulates sequences
+ by creating a table for every sequence.
+
Binding
+
Binding variables in an SQL statement is another tricky feature. Binding is
+ useful because it allows pre-compilation of SQL. When inserting multiple records
+ into a database in a loop, binding can offer a 50% (or greater) speedup. However
+ many databases such as Access and MySQL do not support binding natively and
+ there is some overhead in emulating binding. Furthermore, different databases
+ (specificly Oracle!) implement binding differently. My recommendation is to
+ use binding if your database queries are too slow, but make sure you are using
+ a database that supports it like Oracle.
+
ADOdb supports portable Prepare/Execute with:
+
$stmt = $db->Prepare('select * from customers where custid=? and state=?');
+$rs = $db->Execute($stmt, array($id,'New York'));
+
Oracle uses named bind placeholders, not "?", so to support portable binding, we have Param() that generates
+the correct placeholder (available since ADOdb 3.92):
+
$sql = 'insert into table (col1,col2) values ('.$DB->Param('a').','.$DB->Param('b').')';
+# generates 'insert into table (col1,col2) values (?,?)'
+# or 'insert into table (col1,col2) values (:a,:b)'
+$stmt = $DB->Prepare($sql);
+$stmt = $DB->Execute($stmt,array('one','two'));
+
+
+
Portable Native SQL
+
ADOdb provides the following functions for portably generating SQL functions
+ as strings to be merged into your SQL statements (some are only available since
+ ADOdb 3.92):
+
+
+
Function
+
Description
+
+
+
DBDate($date)
+
Pass in a UNIX timestamp or ISO date and it will convert it to a date
+ string formatted for INSERT/UPDATE
+
+
+
DBTimeStamp($date)
+
Pass in a UNIX timestamp or ISO date and it will convert it to a timestamp
+ string formatted for INSERT/UPDATE
+
+
+
SQLDate($date, $fmt)
+
Portably generate a date formatted using $fmt mask, for use in SELECT
+ statements.
+
+
+
OffsetDate($date, $ndays)
+
Portably generate a $date offset by $ndays.
+
+
+
Concat($s1, $s2, ...)
+
Portably concatenate strings. Alternatively, for mssql use mssqlpo driver,
+ which allows || operator.
+
+
+
IfNull($fld, $replaceNull)
+
Returns a string that is the equivalent of MySQL IFNULL or Oracle NVL.
+
+
+
Param($name)
+
Generates bind placeholders, using ? or named conventions as appropriate.
+
+
$db->sysDate
Property that holds the SQL function that returns today's date
+
+
$db->sysTimeStamp
Property that holds the SQL function that returns the current
+timestamp (date+time).
+
+
+
+
$db->concat_operator
Property that holds the concatenation operator
+
+
+
$db->length
Property that holds the name of the SQL strlen function.
+
+
+
$db->upperCase
Property that holds the name of the SQL strtoupper function.
+
+
$db->random
Property that holds the SQL to generate a random number between 0.00 and 1.00.
+
+
+
$db->substr
Property that holds the name of the SQL substring function.
+
+
+
+
DDL and Tuning
+There are database design tools such as ERWin or Dezign that allow you to generate data definition language commands such as ALTER TABLE or CREATE INDEX from Entity-Relationship diagrams.
+
+However if you prefer to use a PHP-based table creation scheme, adodb provides you with this feature. Here is the code to generate the SQL to create a table with:
+
+
Auto-increment primary key 'ID',
+
The person's 'NAME' VARCHAR(32) NOT NULL and defaults to '',
+
The date and time of record creation 'CREATED',
+
The person's 'AGE', defaulting to 0, type NUMERIC(16).
+
+
+Also create a compound index consisting of 'NAME' and 'AGE':
+
+$datadict = NewDataDictionary($connection);
+$flds = "
+ ID I AUTOINCREMENT PRIMARY,
+ NAME C(32) DEFAULT '' NOTNULL,
+ CREATED T DEFTIMESTAMP,
+ AGE N(16) DEFAULT 0
+";
+$sql1 = $datadict->CreateTableSQL('tabname', $flds);
+$sql2 = $datadict->CreateIndexSQL('idx_name_age', 'tabname', 'NAME,AGE');
+
+
+
Data Types
+
Stick to a few data types that are available in most databases. Char, varchar
+ and numeric/number are supported by most databases. Most other data types (including
+ integer, boolean and float) cannot be relied on being available. I recommend
+ using char(1) or number(1) to hold booleans.
+
Different databases have different ways of representing dates and timestamps/datetime.
+ ADOdb attempts to display all dates in ISO (YYYY-MM-DD) format. ADOdb also provides
+ DBDate( ) and DBTimeStamp( ) to convert dates to formats that are acceptable
+ to that database. Both functions accept Unix integer timestamps and date strings
+ in ISO format.
We also provide functions to convert database dates to Unix timestamps:
+
$unixts = $recordset->UnixDate('#2002-02-30#'); # MS Access date =gt; unix timestamp
+
For date calculations, we have OffsetDate which allows you to calculate dates such as yesterday and next week in a RDBMS independant fashion. For example, if we want to set a field to 6 hour from now, use:
+
+$sql = 'update table set dtimefld='.$db->OffsetDate($db->sysTimeStamp, 6/24).' where ...';
+
+
The maximum length of a char/varchar field is also database specific. You can
+ only assume that field lengths of up to 250 characters are supported. This is
+ normally impractical for web based forum or content management systems. You
+ will need to be familiar with how databases handle large objects (LOBs). ADOdb
+ implements two functions, UpdateBlob( ) and UpdateClob( ) that allow you to
+ update fields holding Binary Large Objects (eg. pictures) and Character Large
+ Objects (eg. HTML articles):
+
# for oracle
+$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1,empty_blob())');
+$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');
+
+# non-oracle databases
+$conn->Execute('INSERT INTO blobtable (id, blobcol) VALUES (1, null)');
+$conn->UpdateBlob('blobtable','blobcol',$blobvalue,'id=1');
+
+
Null handling is another area where differences can occur. This is a mine-field,
+ because 3-value logic is tricky.
+
In general, I avoid using nulls except for dates and default all my numeric
+ and character fields to 0 or the empty string. This maintains consistency with
+ PHP, where empty strings and zero are treated as equivalent, and avoids SQL
+ ambiguities when you use the ANY and EXISTS operators. However if your database
+ has significant amounts of missing or unknown data, using nulls might be a good
+ idea.
+
+ ADOdb also supports a portable IfNull function, so you can define what to display
+ if the field contains a null.
+
Stored Procedures
+
Stored procedures are another problem area. Some databases allow recordsets
+ to be returned in a stored procedure (Microsoft SQL Server and Sybase), and
+ others only allow output parameters to be returned. Stored procedures sometimes
+ need to be wrapped in special syntax. For example, Oracle requires such code
+ to be wrapped in an anonymous block with BEGIN and END. Also internal sql operators
+ and functions such as +, ||, TRIM( ), SUBSTR( ) or INSTR( ) vary between vendors.
+
+
An example of how to call a stored procedure with 2 parameters and 1 return
+ value follows:
As you can see, the ADOdb API is the same for both databases. But the stored
+ procedure SQL syntax is quite different between databases and is not portable,
+ so be forewarned! However sometimes you have little choice as some systems only
+ allow data to be accessed via stored procedures. This is when the ultimate portability
+ solution might be the only solution: treating portable SQL as a localization
+ exercise...
+
SQL as a Localization Exercise
+
In general to provide real portability, you will have to treat SQL coding
+ as a localization exercise. In PHP, it has become common to define separate
+ language files for English, Russian, Korean, etc. Similarly, I would suggest
+ you have separate Sybase, Intebase, MySQL, etc files, and conditionally include
+ the SQL based on the database. For example, each MySQL SQL statement would be
+ stored in a separate variable, in a file called 'mysql-lang.inc.php'.
+
$sqlGetPassword = 'select password from users where userid=%s';
+$sqlSearchKeyword = quot;SELECT * FROM articles WHERE match (title,body) against (%s)";
+
In our main PHP file:
+
# define which database to load...
+$database = 'mysql';
+include_once("$database-lang.inc.php");
+
+$db = NewADOConnection($database);
+$db->PConnect(...) or die('Failed to connect to database');
+
+# search for a keyword $word
+$rs = $db->Execute(sprintf($sqlSearchKeyWord,$db->qstr($word)));
+
Note that we quote the $word variable using the qstr( ) function. This is because
+ each database quotes strings using different conventions.
+
+
Final Thoughts
+
The best way to ensure that you have portable SQL is to have your data tables designed using
+sound principles. Learn the theory of normalization and entity-relationship diagrams and model
+your data carefully. Understand how joins and indexes work and how they are used to tune performance.
+
You say eether and I say eyether,
- You say neether and I say nyther;
- Eether, eyether, neether, nyther -
- Let's call the whole thing off !
-
- You like potato and I like po-tah-to,
- You like tomato and I like to-mah-to;
- Potato, po-tah-to, tomato, to-mah-to -
- Let's call the whole thing off !
-
-
I love this song, especially the version with Louis Armstrong and Ella singing
- duet. It is all about how hard it is for two people in love to be compatible
- with each other. It's about compromise and finding a common ground, and that's
- what this article is all about.
-
PHP is all about creating dynamic web-sites with the least fuss and the most
- fun. To create these websites we need to use databases to retrieve login information,
- to splash dynamic news onto the web page and store forum postings. So let's
- say we were using the popular MySQL database for this. Your company has done
- such a fantastic job that the Web site is more popular than your wildest dreams.
- You find that MySQL cannot scale to handle the workload; time to switch databases.
-
Unfortunately in PHP every database is accessed slightly differently. To connect
- to MySQL, you would use mysql_connect(); when you decide to upgrade to
- Oracle or Microsoft SQL Server, you would use ocilogon() or mssql_connect()
- respectively. What is worse is that the parameters you use for the different
- connect functions are different also.. One database says po-tato, the other
- database says pota-to. Oh-oh.
-
Let's NOT call the whole thing off
-
A database wrapper library such as ADODB comes in handy when you need to ensure portability. It provides
- you with a common API to communicate with any supported database so you don't have to call things off.
-
-
ADODB stands for Active Data Objects DataBase (sorry computer guys are sometimes
- not very original). ADODB currently supports MySQL, PostgreSQL, Oracle, Interbase,
- Microsoft SQL Server, Access, FoxPro, Sybase, ODBC and ADO. You can download
- ADODB from http://php.weblogs.com/adodb.
-
MySQL Example
-
The most common database used with PHP is MySQL, so I guess you should be familiar
- with the following code. It connects to a MySQL server at localhost,
- database mydb, and executes an SQL select statement. The results are
- printed, one line per row.
-
The above code has been color-coded by section. The first section is the connection
- phase. The second is the execution of the SQL, and the last section is displaying
- the fields. The while loop scans the rows of the result, while the for
- loop scans the fields in one row.
The connection code is a bit more sophisticated than MySQL's because our needs
- are more sophisticated. In ADODB, we use an object-oriented approach to managing
- the complexity of handling multiple databases. We have different classes to
- handle different databases. If you aren't familiar with object-oriented programing,
- don't worry -- the complexity is all hidden away in the NewADOConnection()
- function.
-
To conserve memory, we only load the PHP code specific to the database you
- are connecting to. We do this by calling NewADOConnection(databasedriver).
- Legal database drivers include mysql, mssql, oracle, oci8, postgres, sybase,
- vfp, access, ibase and many others.
-
Then we create a new instance of the connection class by calling NewADOConnection().
- Finally we connect to the database using $db->Connect().
-
Executing the SQL
-
$result = $db->Execute("SELECT *
- FROM employees");
- if ($result === false) die("failed");
-
-
-
Sending the SQL statement to the server is straight forward. Execute() will
- return a recordset object on successful execution. You should check $result
- as we do above.
-
An issue that confuses beginners is the fact that we have two types of objects
- in ADODB, the connection object and the recordset object. When do we use each?
-
The connection object ($db) is responsible for connecting to the database,
- formatting your SQL and querying the database server. The recordset object ($result)
- is responsible for retrieving the results and formatting the reply as text or
- as an array.
-
The only thing I need to add is that ADODB provides several helper functions
- for making INSERT and UPDATE statements easier, which we will cover in the Advanced
- section.
-
The paradigm for getting the data is that it's like reading a file. For every
- line, we check first whether we have reached the end-of-file (EOF). While not
- end-of-file, loop through each field in the row. Then move to the next line
- (MoveNext) and repeat.
-
The $result->fields[] array is generated by the PHP database
- extension. Some database extensions do not index the array by field name.
- To force indexing by name - that is associative arrays -
- use the $ADODB_FETCH_MODE global variable.
-
-As you can see in the above example, both recordsets store and use different fetch modes
-based on the $ADODB_FETCH_MODE setting when the recordset was created by Execute().
-
ADOConnection
-
Object that performs the connection to the database, executes SQL statements
- and has a set of utility functions for standardising the format of SQL statements
- for issues such as concatenation and date formats.
-
-
Other Useful Functions
-
$recordset->Move($pos) scrolls to that particular row. ADODB supports forward
- scrolling for all databases. Some databases will not support backwards scrolling.
- This is normally not a problem as you can always cache records to simulate backwards
- scrolling.
-
$recordset->RecordCount() returns the number of records accessed by the
- SQL statement. Some databases will return -1 because it is not supported.
-
$recordset->GetArray() returns the result as an array.
-
rs2html($recordset) is a function that is generates a HTML table based on the
- $recordset passed to it. An example with the relevant lines in bold:
-
include('adodb.inc.php');
- include('tohtml.inc.php'); /* includes the rs2html function */
- $conn = ADONewConnection('mysql');
- $conn->PConnect('localhost','userid','password','database');
- $rs = $conn->Execute('select * from table');
- rs2html($rs); /* recordset to html table */
Let's say you want to insert the following data into a database.
-
ID = 3
- TheDate=mktime(0,0,0,8,31,2001) /* 31st August 2001 */
- Note= sugar why don't we call it off
-
When you move to another database, your insert might no longer work.
-
The first problem is that each database has a different default date format.
- MySQL expects YYYY-MM-DD format, while other databases have different defaults.
- ADODB has a function called DBDate() that addresses this issue by converting
- converting the date to the correct format.
-
The next problem is that the don't in the Note needs to be quoted. In
- MySQL, we use don\'t but in some other databases (Sybase, Access, Microsoft
- SQL Server) we use don''t. The qstr() function addresses this issue.
ADODB also supports $connection->Affected_Rows() (returns the
- number of rows affected by last update or delete) and $recordset->Insert_ID()
- (returns last autoincrement number generated by an insert statement). Be forewarned
- that not all databases support the two functions.
-
-
MetaTypes
-
You can find out more information about each of the fields (I use the words
- fields and columns interchangebly) you are selecting by calling the recordset
- method FetchField($fieldoffset). This will return an object with
- 3 properties: name, type and max_length.
-
For example:
-
$recordset = $conn->Execute("select adate from table"); $f0 = $recordset->FetchField(0);
-
-
Then $f0->name will hold 'adata', $f0->type
- will be set to 'date'. If the max_length is unknown, it will be set to
- -1.
-
One problem with handling different databases is that each database often calls
- the same type by a different name. For example a timestamp type is called
- datetime in one database and time in another. So ADODB has a special
- MetaType($type, $max_length) function that standardises the types
- to the following:
-
C: character and varchar types
- X: text or long character (eg. more than 255 bytes wide).
- B: blob or binary image
- D: date
- T: timestamp
- L: logical (boolean)
- I: integer
- N: numeric (float, double, money)
-
ADODB has a function called $connection->SelectLimit($sql,$nrows,$offset) that allows
-you to retrieve a subset of the recordset. This will take advantage of native
-SELECT TOP on Microsoft products and SELECT ... LIMIT with PostgreSQL and MySQL, and
-emulated if the database does not support it.
-
Caching Support
-
ADODB allows you to cache recordsets in your file system, and only requery the database
-server after a certain timeout period with $connection->CacheExecute($secs2cache,$sql) and
-$connection->CacheSelectLimit($secs2cache,$sql,$nrows,$offset).
-
PHP4 Session Handler Support
-
ADODB also supports PHP4 session handlers. You can store your session variables
- in a database for true scalability using ADODB. For further information, visit
- http://php.weblogs.com/adodb-sessions
-
Commercial Use Encouraged
-
If you plan to write commercial PHP applications that you want to resell, you should consider ADODB. It has been released using the lesser GPL, which means you can legally include it in commercial applications, while keeping your code proprietary. Commercial use of ADODB is strongly encouraged! We are using it internally for this reason.
-
-
Conclusion
-
As a thank you for finishing this article, here are the complete lyrics for
- let's call the whole thing off.
-
-
- Refrain
-
- You say eether and I say eyether,
- You say neether and I say nyther;
- Eether, eyether, neether, nyther -
- Let's call the whole thing off !
-
- You like potato and I like po-tah-to,
- You like tomato and I like to-mah-to;
- Potato, po-tah-to, tomato, to-mah-to -
- Let's call the whole thing off !
-
-But oh, if we call the whole thing off, then we must part.
-And oh, if we ever part, then that might break my heart.
-
- So, if you like pajamas and I like pa-jah-mas,
- I'll wear pajamas and give up pa-jah-mas.
- For we know we
- Need each other, so we
- Better call the calling off off.
- Let's call the whole thing off !
-
- Second Refrain
-
- You say laughter and I say lawfter,
- You say after and I say awfter;
- Laughter, lawfter, after, awfter -
- Let's call the whole thing off !
-
- You like vanilla and I like vanella,
- You, sa's'parilla and I sa's'parella;
- Vanilla, vanella, choc'late, strawb'ry -
- Let's call the whole thing off !
-
-But oh, if we call the whole thing off, then we must part.
-And oh, if we ever part, then that might break my heart.
-
- So, if you go for oysters and I go for ersters,
- I'll order oysters and cancel the ersters.
- For we know we
- Need each other, so we
- Better call the calling off off.
- Let's call the whole thing off !
-
-
Song and lyrics by George and Ira Gershwin, introduced by Fred Astaire and Ginger Rogers
-in the film "Shall We Dance?"
-
-(c)2001-2002 John Lim.
-
-
-
+
+
+
+
+ Tutorial: Moving from MySQL to ADODB
+
+
+
+
Tutorial: Moving from MySQL to ADODB
+
+
You say eether and I say eyether,
+ You say neether and I say nyther;
+ Eether, eyether, neether, nyther -
+ Let's call the whole thing off !
+
+ You like potato and I like po-tah-to,
+ You like tomato and I like to-mah-to;
+ Potato, po-tah-to, tomato, to-mah-to -
+ Let's call the whole thing off !
+
+
I love this song, especially the version with Louis Armstrong and Ella singing
+ duet. It is all about how hard it is for two people in love to be compatible
+ with each other. It's about compromise and finding a common ground, and that's
+ what this article is all about.
+
PHP is all about creating dynamic web-sites with the least fuss and the most
+ fun. To create these websites we need to use databases to retrieve login information,
+ to splash dynamic news onto the web page and store forum postings. So let's
+ say we were using the popular MySQL database for this. Your company has done
+ such a fantastic job that the Web site is more popular than your wildest dreams.
+ You find that MySQL cannot scale to handle the workload; time to switch databases.
+
Unfortunately in PHP every database is accessed slightly differently. To connect
+ to MySQL, you would use mysql_connect(); when you decide to upgrade to
+ Oracle or Microsoft SQL Server, you would use ocilogon() or mssql_connect()
+ respectively. What is worse is that the parameters you use for the different
+ connect functions are different also.. One database says po-tato, the other
+ database says pota-to. Oh-oh.
+
Let's NOT call the whole thing off
+
A database wrapper library such as ADODB comes in handy when you need to ensure portability. It provides
+ you with a common API to communicate with any supported database so you don't have to call things off.
+
+
ADODB stands for Active Data Objects DataBase (sorry computer guys are sometimes
+ not very original). ADODB currently supports MySQL, PostgreSQL, Oracle, Interbase,
+ Microsoft SQL Server, Access, FoxPro, Sybase, ODBC and ADO. You can download
+ ADODB from http://php.weblogs.com/adodb.
+
MySQL Example
+
The most common database used with PHP is MySQL, so I guess you should be familiar
+ with the following code. It connects to a MySQL server at localhost,
+ database mydb, and executes an SQL select statement. The results are
+ printed, one line per row.
+
The above code has been color-coded by section. The first section is the connection
+ phase. The second is the execution of the SQL, and the last section is displaying
+ the fields. The while loop scans the rows of the result, while the for
+ loop scans the fields in one row.
The connection code is a bit more sophisticated than MySQL's because our needs
+ are more sophisticated. In ADODB, we use an object-oriented approach to managing
+ the complexity of handling multiple databases. We have different classes to
+ handle different databases. If you aren't familiar with object-oriented programing,
+ don't worry -- the complexity is all hidden away in the NewADOConnection()
+ function.
+
To conserve memory, we only load the PHP code specific to the database you
+ are connecting to. We do this by calling NewADOConnection(databasedriver).
+ Legal database drivers include mysql, mssql, oracle, oci8, postgres, sybase,
+ vfp, access, ibase and many others.
+
Then we create a new instance of the connection class by calling NewADOConnection().
+ Finally we connect to the database using $db->Connect().
+
Executing the SQL
+
$result = $db->Execute("SELECT *
+ FROM employees");
+ if ($result === false) die("failed");
+
+
+
Sending the SQL statement to the server is straight forward. Execute() will
+ return a recordset object on successful execution. You should check $result
+ as we do above.
+
An issue that confuses beginners is the fact that we have two types of objects
+ in ADODB, the connection object and the recordset object. When do we use each?
+
The connection object ($db) is responsible for connecting to the database,
+ formatting your SQL and querying the database server. The recordset object ($result)
+ is responsible for retrieving the results and formatting the reply as text or
+ as an array.
+
The only thing I need to add is that ADODB provides several helper functions
+ for making INSERT and UPDATE statements easier, which we will cover in the Advanced
+ section.
+
The paradigm for getting the data is that it's like reading a file. For every
+ line, we check first whether we have reached the end-of-file (EOF). While not
+ end-of-file, loop through each field in the row. Then move to the next line
+ (MoveNext) and repeat.
+
The $result->fields[] array is generated by the PHP database
+ extension. Some database extensions do not index the array by field name.
+ To force indexing by name - that is associative arrays -
+ use the $ADODB_FETCH_MODE global variable.
+
+As you can see in the above example, both recordsets store and use different fetch modes
+based on the $ADODB_FETCH_MODE setting when the recordset was created by Execute().
+
ADOConnection
+
Object that performs the connection to the database, executes SQL statements
+ and has a set of utility functions for standardising the format of SQL statements
+ for issues such as concatenation and date formats.
+
+
Other Useful Functions
+
$recordset->Move($pos) scrolls to that particular row. ADODB supports forward
+ scrolling for all databases. Some databases will not support backwards scrolling.
+ This is normally not a problem as you can always cache records to simulate backwards
+ scrolling.
+
$recordset->RecordCount() returns the number of records accessed by the
+ SQL statement. Some databases will return -1 because it is not supported.
+
$recordset->GetArray() returns the result as an array.
+
rs2html($recordset) is a function that is generates a HTML table based on the
+ $recordset passed to it. An example with the relevant lines in bold:
+
include('adodb.inc.php');
+ include('tohtml.inc.php'); /* includes the rs2html function */
+ $conn = ADONewConnection('mysql');
+ $conn->PConnect('localhost','userid','password','database');
+ $rs = $conn->Execute('select * from table');
+ rs2html($rs); /* recordset to html table */
Let's say you want to insert the following data into a database.
+
ID = 3
+ TheDate=mktime(0,0,0,8,31,2001) /* 31st August 2001 */
+ Note= sugar why don't we call it off
+
When you move to another database, your insert might no longer work.
+
The first problem is that each database has a different default date format.
+ MySQL expects YYYY-MM-DD format, while other databases have different defaults.
+ ADODB has a function called DBDate() that addresses this issue by converting
+ converting the date to the correct format.
+
The next problem is that the don't in the Note needs to be quoted. In
+ MySQL, we use don\'t but in some other databases (Sybase, Access, Microsoft
+ SQL Server) we use don''t. The qstr() function addresses this issue.
ADODB also supports $connection->Affected_Rows() (returns the
+ number of rows affected by last update or delete) and $recordset->Insert_ID()
+ (returns last autoincrement number generated by an insert statement). Be forewarned
+ that not all databases support the two functions.
+
+
MetaTypes
+
You can find out more information about each of the fields (I use the words
+ fields and columns interchangebly) you are selecting by calling the recordset
+ method FetchField($fieldoffset). This will return an object with
+ 3 properties: name, type and max_length.
+
For example:
+
$recordset = $conn->Execute("select adate from table"); $f0 = $recordset->FetchField(0);
+
+
Then $f0->name will hold 'adata', $f0->type
+ will be set to 'date'. If the max_length is unknown, it will be set to
+ -1.
+
One problem with handling different databases is that each database often calls
+ the same type by a different name. For example a timestamp type is called
+ datetime in one database and time in another. So ADODB has a special
+ MetaType($type, $max_length) function that standardises the types
+ to the following:
+
C: character and varchar types
+ X: text or long character (eg. more than 255 bytes wide).
+ B: blob or binary image
+ D: date
+ T: timestamp
+ L: logical (boolean)
+ I: integer
+ N: numeric (float, double, money)
+
ADODB has a function called $connection->SelectLimit($sql,$nrows,$offset) that allows
+you to retrieve a subset of the recordset. This will take advantage of native
+SELECT TOP on Microsoft products and SELECT ... LIMIT with PostgreSQL and MySQL, and
+emulated if the database does not support it.
+
Caching Support
+
ADODB allows you to cache recordsets in your file system, and only requery the database
+server after a certain timeout period with $connection->CacheExecute($secs2cache,$sql) and
+$connection->CacheSelectLimit($secs2cache,$sql,$nrows,$offset).
+
PHP4 Session Handler Support
+
ADODB also supports PHP4 session handlers. You can store your session variables
+ in a database for true scalability using ADODB. For further information, visit
+ http://php.weblogs.com/adodb-sessions
+
Commercial Use Encouraged
+
If you plan to write commercial PHP applications that you want to resell, you should consider ADODB. It has been released using the lesser GPL, which means you can legally include it in commercial applications, while keeping your code proprietary. Commercial use of ADODB is strongly encouraged! We are using it internally for this reason.
+
+
Conclusion
+
As a thank you for finishing this article, here are the complete lyrics for
+ let's call the whole thing off.
+
+
+ Refrain
+
+ You say eether and I say eyether,
+ You say neether and I say nyther;
+ Eether, eyether, neether, nyther -
+ Let's call the whole thing off !
+
+ You like potato and I like po-tah-to,
+ You like tomato and I like to-mah-to;
+ Potato, po-tah-to, tomato, to-mah-to -
+ Let's call the whole thing off !
+
+But oh, if we call the whole thing off, then we must part.
+And oh, if we ever part, then that might break my heart.
+
+ So, if you like pajamas and I like pa-jah-mas,
+ I'll wear pajamas and give up pa-jah-mas.
+ For we know we
+ Need each other, so we
+ Better call the calling off off.
+ Let's call the whole thing off !
+
+ Second Refrain
+
+ You say laughter and I say lawfter,
+ You say after and I say awfter;
+ Laughter, lawfter, after, awfter -
+ Let's call the whole thing off !
+
+ You like vanilla and I like vanella,
+ You, sa's'parilla and I sa's'parella;
+ Vanilla, vanella, choc'late, strawb'ry -
+ Let's call the whole thing off !
+
+But oh, if we call the whole thing off, then we must part.
+And oh, if we ever part, then that might break my heart.
+
+ So, if you go for oysters and I go for ersters,
+ I'll order oysters and cancel the ersters.
+ For we know we
+ Need each other, so we
+ Better call the calling off off.
+ Let's call the whole thing off !
+
+
Song and lyrics by George and Ira Gershwin, introduced by Fred Astaire and Ginger Rogers
+in the film "Shall We Dance?"
+
+(c)2001-2002 John Lim.
+
+
+
diff --git a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-cn.inc.php b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-cn.inc.php
index eb8c7de..44d5f49 100755
--- a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-cn.inc.php
+++ b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-cn.inc.php
@@ -1,35 +1,35 @@
- 'cn',
- DB_ERROR => 'δ֪',
- DB_ERROR_ALREADY_EXISTS => 'Ѿ',
- DB_ERROR_CANNOT_CREATE => 'ܴ',
- DB_ERROR_CANNOT_DELETE => 'ɾ',
- DB_ERROR_CANNOT_DROP => 'ܶ',
- DB_ERROR_CONSTRAINT => 'Լ',
- DB_ERROR_DIVZERO => '0',
- DB_ERROR_INVALID => 'Ч',
- DB_ERROR_INVALID_DATE => 'Чڻʱ',
- DB_ERROR_INVALID_NUMBER => 'Ч',
- DB_ERROR_MISMATCH => 'ƥ',
- DB_ERROR_NODBSELECTED => 'ûݿⱻѡ',
- DB_ERROR_NOSUCHFIELD => 'ûӦֶ',
- DB_ERROR_NOSUCHTABLE => 'ûӦı',
- DB_ERROR_NOT_CAPABLE => 'ݿ̨',
- DB_ERROR_NOT_FOUND => 'ûз',
- DB_ERROR_NOT_LOCKED => 'ûб',
- DB_ERROR_SYNTAX => '',
- DB_ERROR_UNSUPPORTED => '֧',
- DB_ERROR_VALUE_COUNT_ON_ROW => 'ۼֵ',
- DB_ERROR_INVALID_DSN => 'ЧԴ (DSN)',
- DB_ERROR_CONNECT_FAILED => 'ʧ',
- 0 => 'ûд', // DB_OK
- DB_ERROR_NEED_MORE_DATA => 'ṩݲܷҪ',
- DB_ERROR_EXTENSION_NOT_FOUND=> 'չûб',
- DB_ERROR_NOSUCHDB => 'ûӦݿ',
- DB_ERROR_ACCESS_VIOLATION => 'ûкʵȨ'
-);
+ 'cn',
+ DB_ERROR => 'δ֪',
+ DB_ERROR_ALREADY_EXISTS => 'Ѿ',
+ DB_ERROR_CANNOT_CREATE => 'ܴ',
+ DB_ERROR_CANNOT_DELETE => 'ɾ',
+ DB_ERROR_CANNOT_DROP => 'ܶ',
+ DB_ERROR_CONSTRAINT => 'Լ',
+ DB_ERROR_DIVZERO => '0',
+ DB_ERROR_INVALID => 'Ч',
+ DB_ERROR_INVALID_DATE => 'Чڻʱ',
+ DB_ERROR_INVALID_NUMBER => 'Ч',
+ DB_ERROR_MISMATCH => 'ƥ',
+ DB_ERROR_NODBSELECTED => 'ûݿⱻѡ',
+ DB_ERROR_NOSUCHFIELD => 'ûӦֶ',
+ DB_ERROR_NOSUCHTABLE => 'ûӦı',
+ DB_ERROR_NOT_CAPABLE => 'ݿ̨',
+ DB_ERROR_NOT_FOUND => 'ûз',
+ DB_ERROR_NOT_LOCKED => 'ûб',
+ DB_ERROR_SYNTAX => '',
+ DB_ERROR_UNSUPPORTED => '֧',
+ DB_ERROR_VALUE_COUNT_ON_ROW => 'ۼֵ',
+ DB_ERROR_INVALID_DSN => 'ЧԴ (DSN)',
+ DB_ERROR_CONNECT_FAILED => 'ʧ',
+ 0 => 'ûд', // DB_OK
+ DB_ERROR_NEED_MORE_DATA => 'ṩݲܷҪ',
+ DB_ERROR_EXTENSION_NOT_FOUND=> 'չûб',
+ DB_ERROR_NOSUCHDB => 'ûӦݿ',
+ DB_ERROR_ACCESS_VIOLATION => 'ûкʵȨ'
+);
?>
\ No newline at end of file
diff --git a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-cz.inc.php b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-cz.inc.php
index 2424c24..1f5c08a 100755
--- a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-cz.inc.php
+++ b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-cz.inc.php
@@ -1,40 +1,40 @@
-
-
-$ADODB_LANG_ARRAY = array (
- 'LANG' => 'cz',
- DB_ERROR => 'neznm chyba',
- DB_ERROR_ALREADY_EXISTS => 'ji? existuje',
- DB_ERROR_CANNOT_CREATE => 'nelze vytvo?it',
- DB_ERROR_CANNOT_DELETE => 'nelze smazat',
- DB_ERROR_CANNOT_DROP => 'nelze odstranit',
- DB_ERROR_CONSTRAINT => 'poru?en omezujc podmnky',
- DB_ERROR_DIVZERO => 'd?len nulou',
- DB_ERROR_INVALID => 'neplatn',
- DB_ERROR_INVALID_DATE => 'neplatn datum nebo ?as',
- DB_ERROR_INVALID_NUMBER => 'neplatn ?slo',
- DB_ERROR_MISMATCH => 'nesouhlas',
- DB_ERROR_NODBSELECTED => '?dn databze nen vybrna',
- DB_ERROR_NOSUCHFIELD => 'pole nenalezeno',
- DB_ERROR_NOSUCHTABLE => 'tabulka nenalezena',
- DB_ERROR_NOT_CAPABLE => 'nepodporovno',
- DB_ERROR_NOT_FOUND => 'nenalezeno',
- DB_ERROR_NOT_LOCKED => 'nezam?eno',
- DB_ERROR_SYNTAX => 'syntaktick chyba',
- DB_ERROR_UNSUPPORTED => 'nepodporovno',
- DB_ERROR_VALUE_COUNT_ON_ROW => '',
- DB_ERROR_INVALID_DSN => 'neplatn DSN',
- DB_ERROR_CONNECT_FAILED => 'p?ipojen selhalo',
- 0 => 'bez chyb', // DB_OK
- DB_ERROR_NEED_MORE_DATA => 'mlo zdrojovch dat',
- DB_ERROR_EXTENSION_NOT_FOUND=> 'roz??en nenalezeno',
- DB_ERROR_NOSUCHDB => 'databze neexistuje',
- DB_ERROR_ACCESS_VIOLATION => 'nedostate?n prva'
-);
+
+
+$ADODB_LANG_ARRAY = array (
+ 'LANG' => 'cz',
+ DB_ERROR => 'neznm chyba',
+ DB_ERROR_ALREADY_EXISTS => 'ji? existuje',
+ DB_ERROR_CANNOT_CREATE => 'nelze vytvo?it',
+ DB_ERROR_CANNOT_DELETE => 'nelze smazat',
+ DB_ERROR_CANNOT_DROP => 'nelze odstranit',
+ DB_ERROR_CONSTRAINT => 'poru?en omezujc podmnky',
+ DB_ERROR_DIVZERO => 'd?len nulou',
+ DB_ERROR_INVALID => 'neplatn',
+ DB_ERROR_INVALID_DATE => 'neplatn datum nebo ?as',
+ DB_ERROR_INVALID_NUMBER => 'neplatn ?slo',
+ DB_ERROR_MISMATCH => 'nesouhlas',
+ DB_ERROR_NODBSELECTED => '?dn databze nen vybrna',
+ DB_ERROR_NOSUCHFIELD => 'pole nenalezeno',
+ DB_ERROR_NOSUCHTABLE => 'tabulka nenalezena',
+ DB_ERROR_NOT_CAPABLE => 'nepodporovno',
+ DB_ERROR_NOT_FOUND => 'nenalezeno',
+ DB_ERROR_NOT_LOCKED => 'nezam?eno',
+ DB_ERROR_SYNTAX => 'syntaktick chyba',
+ DB_ERROR_UNSUPPORTED => 'nepodporovno',
+ DB_ERROR_VALUE_COUNT_ON_ROW => '',
+ DB_ERROR_INVALID_DSN => 'neplatn DSN',
+ DB_ERROR_CONNECT_FAILED => 'p?ipojen selhalo',
+ 0 => 'bez chyb', // DB_OK
+ DB_ERROR_NEED_MORE_DATA => 'mlo zdrojovch dat',
+ DB_ERROR_EXTENSION_NOT_FOUND=> 'roz??en nenalezeno',
+ DB_ERROR_NOSUCHDB => 'databze neexistuje',
+ DB_ERROR_ACCESS_VIOLATION => 'nedostate?n prva'
+);
?>
\ No newline at end of file
diff --git a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-de.inc.php b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-de.inc.php
index 244cb2f..44c57e9 100755
--- a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-de.inc.php
+++ b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-de.inc.php
@@ -1,33 +1,33 @@
-
-$ADODB_LANG_ARRAY = array (
- 'LANG' => 'de',
- DB_ERROR => 'Unbekannter Fehler',
- DB_ERROR_ALREADY_EXISTS => 'existiert bereits',
- DB_ERROR_CANNOT_CREATE => 'kann nicht erstellen',
- DB_ERROR_CANNOT_DELETE => 'kann nicht löschen',
- DB_ERROR_CANNOT_DROP => 'Tabelle oder Index konnte nicht gelöscht werden',
- DB_ERROR_CONSTRAINT => 'Constraint Verletzung',
- DB_ERROR_DIVZERO => 'Division durch Null',
- DB_ERROR_INVALID => 'ung¨ltig',
- DB_ERROR_INVALID_DATE => 'ung¨ltiges Datum oder Zeit',
- DB_ERROR_INVALID_NUMBER => 'ung¨ltige Zahl',
- DB_ERROR_MISMATCH => 'Unverträglichkeit',
- DB_ERROR_NODBSELECTED => 'keine Dantebank ausgewählt',
- DB_ERROR_NOSUCHFIELD => 'Feld nicht vorhanden',
- DB_ERROR_NOSUCHTABLE => 'Tabelle nicht vorhanden',
- DB_ERROR_NOT_CAPABLE => 'Funktion nicht installiert',
- DB_ERROR_NOT_FOUND => 'nicht gefunden',
- DB_ERROR_NOT_LOCKED => 'nicht gesperrt',
- DB_ERROR_SYNTAX => 'Syntaxfehler',
- DB_ERROR_UNSUPPORTED => 'nicht Unterst¨tzt',
- DB_ERROR_VALUE_COUNT_ON_ROW => 'Anzahl der zur¨ckgelieferten Felder entspricht nicht der Anzahl der Felder in der Abfrage',
- DB_ERROR_INVALID_DSN => 'ung¨ltiger DSN',
- DB_ERROR_CONNECT_FAILED => 'Verbindung konnte nicht hergestellt werden',
- 0 => 'kein Fehler', // DB_OK
- DB_ERROR_NEED_MORE_DATA => 'Nicht gen¨gend Daten geliefert',
- DB_ERROR_EXTENSION_NOT_FOUND=> 'erweiterung nicht gefunden',
- DB_ERROR_NOSUCHDB => 'keine Datenbank',
- DB_ERROR_ACCESS_VIOLATION => 'ungen¨gende Rechte'
-);
+
+$ADODB_LANG_ARRAY = array (
+ 'LANG' => 'de',
+ DB_ERROR => 'Unbekannter Fehler',
+ DB_ERROR_ALREADY_EXISTS => 'existiert bereits',
+ DB_ERROR_CANNOT_CREATE => 'kann nicht erstellen',
+ DB_ERROR_CANNOT_DELETE => 'kann nicht löschen',
+ DB_ERROR_CANNOT_DROP => 'Tabelle oder Index konnte nicht gelöscht werden',
+ DB_ERROR_CONSTRAINT => 'Constraint Verletzung',
+ DB_ERROR_DIVZERO => 'Division durch Null',
+ DB_ERROR_INVALID => 'ung¨ltig',
+ DB_ERROR_INVALID_DATE => 'ung¨ltiges Datum oder Zeit',
+ DB_ERROR_INVALID_NUMBER => 'ung¨ltige Zahl',
+ DB_ERROR_MISMATCH => 'Unverträglichkeit',
+ DB_ERROR_NODBSELECTED => 'keine Dantebank ausgewählt',
+ DB_ERROR_NOSUCHFIELD => 'Feld nicht vorhanden',
+ DB_ERROR_NOSUCHTABLE => 'Tabelle nicht vorhanden',
+ DB_ERROR_NOT_CAPABLE => 'Funktion nicht installiert',
+ DB_ERROR_NOT_FOUND => 'nicht gefunden',
+ DB_ERROR_NOT_LOCKED => 'nicht gesperrt',
+ DB_ERROR_SYNTAX => 'Syntaxfehler',
+ DB_ERROR_UNSUPPORTED => 'nicht Unterst¨tzt',
+ DB_ERROR_VALUE_COUNT_ON_ROW => 'Anzahl der zur¨ckgelieferten Felder entspricht nicht der Anzahl der Felder in der Abfrage',
+ DB_ERROR_INVALID_DSN => 'ung¨ltiger DSN',
+ DB_ERROR_CONNECT_FAILED => 'Verbindung konnte nicht hergestellt werden',
+ 0 => 'kein Fehler', // DB_OK
+ DB_ERROR_NEED_MORE_DATA => 'Nicht gen¨gend Daten geliefert',
+ DB_ERROR_EXTENSION_NOT_FOUND=> 'erweiterung nicht gefunden',
+ DB_ERROR_NOSUCHDB => 'keine Datenbank',
+ DB_ERROR_ACCESS_VIOLATION => 'ungen¨gende Rechte'
+);
?>
\ No newline at end of file
diff --git a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-fa.inc.php b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-fa.inc.php
index 5594313..a58a21c 100755
--- a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-fa.inc.php
+++ b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-fa.inc.php
@@ -1,35 +1,35 @@
- */
-
-$ADODB_LANG_ARRAY = array (
- 'LANG' => 'fa',
- DB_ERROR => 'خطای ناشناخته',
- DB_ERROR_ALREADY_EXISTS => 'وجود دارد',
- DB_ERROR_CANNOT_CREATE => 'امکان create وجود ندارد',
- DB_ERROR_CANNOT_DELETE => 'امکان حذف وجود ندارد',
- DB_ERROR_CANNOT_DROP => 'امکان drop وجود ندارد',
- DB_ERROR_CONSTRAINT => 'نقض شرط',
- DB_ERROR_DIVZERO => 'تقسیم بر صفر',
- DB_ERROR_INVALID => 'نامعتبر',
- DB_ERROR_INVALID_DATE => 'زمان یا تاریخ نامعتبر',
- DB_ERROR_INVALID_NUMBER => 'عدد نامعتبر',
- DB_ERROR_MISMATCH => 'عدم مطابقت',
- DB_ERROR_NODBSELECTED => 'بانک اطلاعاتی انتخاب نشده است',
- DB_ERROR_NOSUCHFIELD => 'چنین ستونی وجود ندارد',
- DB_ERROR_NOSUCHTABLE => 'چنین جدولی وجود ندارد',
- DB_ERROR_NOT_CAPABLE => 'backend بانک اطلاعاتی قادر نیست',
- DB_ERROR_NOT_FOUND => 'پیدا نشد',
- DB_ERROR_NOT_LOCKED => 'قفل نشده',
- DB_ERROR_SYNTAX => 'خطای دستوری',
- DB_ERROR_UNSUPPORTED => 'پشتیبانی نمی شود',
- DB_ERROR_VALUE_COUNT_ON_ROW => 'شمارش مقادیر روی ردیف',
- DB_ERROR_INVALID_DSN => 'DSN نامعتبر',
- DB_ERROR_CONNECT_FAILED => 'ارتباط برقرار نشد',
- 0 => 'بدون خطا', // DB_OK
- DB_ERROR_NEED_MORE_DATA => 'داده ناکافی است',
- DB_ERROR_EXTENSION_NOT_FOUND=> 'extension پیدا نشد',
- DB_ERROR_NOSUCHDB => 'چنین بانک اطلاعاتی وجود ندارد',
- DB_ERROR_ACCESS_VIOLATION => 'حق دسترسی ناکافی'
-);
+ */
+
+$ADODB_LANG_ARRAY = array (
+ 'LANG' => 'fa',
+ DB_ERROR => 'خطای ناشناخته',
+ DB_ERROR_ALREADY_EXISTS => 'وجود دارد',
+ DB_ERROR_CANNOT_CREATE => 'امکان create وجود ندارد',
+ DB_ERROR_CANNOT_DELETE => 'امکان حذف وجود ندارد',
+ DB_ERROR_CANNOT_DROP => 'امکان drop وجود ندارد',
+ DB_ERROR_CONSTRAINT => 'نقض شرط',
+ DB_ERROR_DIVZERO => 'تقسیم بر صفر',
+ DB_ERROR_INVALID => 'نامعتبر',
+ DB_ERROR_INVALID_DATE => 'زمان یا تاریخ نامعتبر',
+ DB_ERROR_INVALID_NUMBER => 'عدد نامعتبر',
+ DB_ERROR_MISMATCH => 'عدم مطابقت',
+ DB_ERROR_NODBSELECTED => 'بانک اطلاعاتی انتخاب نشده است',
+ DB_ERROR_NOSUCHFIELD => 'چنین ستونی وجود ندارد',
+ DB_ERROR_NOSUCHTABLE => 'چنین جدولی وجود ندارد',
+ DB_ERROR_NOT_CAPABLE => 'backend بانک اطلاعاتی قادر نیست',
+ DB_ERROR_NOT_FOUND => 'پیدا نشد',
+ DB_ERROR_NOT_LOCKED => 'قفل نشده',
+ DB_ERROR_SYNTAX => 'خطای دستوری',
+ DB_ERROR_UNSUPPORTED => 'پشتیبانی نمی شود',
+ DB_ERROR_VALUE_COUNT_ON_ROW => 'شمارش مقادیر روی ردیف',
+ DB_ERROR_INVALID_DSN => 'DSN نامعتبر',
+ DB_ERROR_CONNECT_FAILED => 'ارتباط برقرار نشد',
+ 0 => 'بدون خطا', // DB_OK
+ DB_ERROR_NEED_MORE_DATA => 'داده ناکافی است',
+ DB_ERROR_EXTENSION_NOT_FOUND=> 'extension پیدا نشد',
+ DB_ERROR_NOSUCHDB => 'چنین بانک اطلاعاتی وجود ندارد',
+ DB_ERROR_ACCESS_VIOLATION => 'حق دسترسی ناکافی'
+);
?>
\ No newline at end of file
diff --git a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-fr.inc.php b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-fr.inc.php
index 066a2a5..11127cd 100755
--- a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-fr.inc.php
+++ b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-fr.inc.php
@@ -1,33 +1,33 @@
- 'fr',
- DB_ERROR => 'erreur inconnue',
- DB_ERROR_ALREADY_EXISTS => 'existe déjà',
- DB_ERROR_CANNOT_CREATE => 'crétion impossible',
- DB_ERROR_CANNOT_DELETE => 'effacement impossible',
- DB_ERROR_CANNOT_DROP => 'suppression impossible',
- DB_ERROR_CONSTRAINT => 'violation de contrainte',
- DB_ERROR_DIVZERO => 'division par zéro',
- DB_ERROR_INVALID => 'invalide',
- DB_ERROR_INVALID_DATE => 'date ou heure invalide',
- DB_ERROR_INVALID_NUMBER => 'nombre invalide',
- DB_ERROR_MISMATCH => 'erreur de concordance',
- DB_ERROR_NODBSELECTED => 'pas de base de donnéessélectionnée',
- DB_ERROR_NOSUCHFIELD => 'nom de colonne invalide',
- DB_ERROR_NOSUCHTABLE => 'table ou vue inexistante',
- DB_ERROR_NOT_CAPABLE => 'fonction optionnelle non installée',
- DB_ERROR_NOT_FOUND => 'pas trouvé',
- DB_ERROR_NOT_LOCKED => 'non verrouillé',
- DB_ERROR_SYNTAX => 'erreur de syntaxe',
- DB_ERROR_UNSUPPORTED => 'non supporté',
- DB_ERROR_VALUE_COUNT_ON_ROW => 'valeur insérée trop grande pour colonne',
- DB_ERROR_INVALID_DSN => 'DSN invalide',
- DB_ERROR_CONNECT_FAILED => 'échec à la connexion',
- 0 => "pas d'erreur", // DB_OK
- DB_ERROR_NEED_MORE_DATA => 'données fournies insuffisantes',
- DB_ERROR_EXTENSION_NOT_FOUND=> 'extension non trouvée',
- DB_ERROR_NOSUCHDB => 'base de données inconnue',
- DB_ERROR_ACCESS_VIOLATION => 'droits insuffisants'
-);
+ 'fr',
+ DB_ERROR => 'erreur inconnue',
+ DB_ERROR_ALREADY_EXISTS => 'existe déjà',
+ DB_ERROR_CANNOT_CREATE => 'crétion impossible',
+ DB_ERROR_CANNOT_DELETE => 'effacement impossible',
+ DB_ERROR_CANNOT_DROP => 'suppression impossible',
+ DB_ERROR_CONSTRAINT => 'violation de contrainte',
+ DB_ERROR_DIVZERO => 'division par zéro',
+ DB_ERROR_INVALID => 'invalide',
+ DB_ERROR_INVALID_DATE => 'date ou heure invalide',
+ DB_ERROR_INVALID_NUMBER => 'nombre invalide',
+ DB_ERROR_MISMATCH => 'erreur de concordance',
+ DB_ERROR_NODBSELECTED => 'pas de base de donnéessélectionnée',
+ DB_ERROR_NOSUCHFIELD => 'nom de colonne invalide',
+ DB_ERROR_NOSUCHTABLE => 'table ou vue inexistante',
+ DB_ERROR_NOT_CAPABLE => 'fonction optionnelle non installée',
+ DB_ERROR_NOT_FOUND => 'pas trouvé',
+ DB_ERROR_NOT_LOCKED => 'non verrouillé',
+ DB_ERROR_SYNTAX => 'erreur de syntaxe',
+ DB_ERROR_UNSUPPORTED => 'non supporté',
+ DB_ERROR_VALUE_COUNT_ON_ROW => 'valeur insérée trop grande pour colonne',
+ DB_ERROR_INVALID_DSN => 'DSN invalide',
+ DB_ERROR_CONNECT_FAILED => 'échec à la connexion',
+ 0 => "pas d'erreur", // DB_OK
+ DB_ERROR_NEED_MORE_DATA => 'données fournies insuffisantes',
+ DB_ERROR_EXTENSION_NOT_FOUND=> 'extension non trouvée',
+ DB_ERROR_NOSUCHDB => 'base de données inconnue',
+ DB_ERROR_ACCESS_VIOLATION => 'droits insuffisants'
+);
?>
\ No newline at end of file
diff --git a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-it.inc.php b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-it.inc.php
index 20c5b93..ac5cc5a 100755
--- a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-it.inc.php
+++ b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-it.inc.php
@@ -1,34 +1,34 @@
- 'it',
- DB_ERROR => 'errore sconosciuto',
- DB_ERROR_ALREADY_EXISTS => 'esiste già',
- DB_ERROR_CANNOT_CREATE => 'non posso creare',
- DB_ERROR_CANNOT_DELETE => 'non posso cancellare',
- DB_ERROR_CANNOT_DROP => 'non posso eliminare',
- DB_ERROR_CONSTRAINT => 'violazione constraint',
- DB_ERROR_DIVZERO => 'divisione per zero',
- DB_ERROR_INVALID => 'non valido',
- DB_ERROR_INVALID_DATE => 'data od ora non valida',
- DB_ERROR_INVALID_NUMBER => 'numero non valido',
- DB_ERROR_MISMATCH => 'diversi',
- DB_ERROR_NODBSELECTED => 'nessun database selezionato',
- DB_ERROR_NOSUCHFIELD => 'nessun campo trovato',
- DB_ERROR_NOSUCHTABLE => 'nessuna tabella trovata',
- DB_ERROR_NOT_CAPABLE => 'DB backend non abilitato',
- DB_ERROR_NOT_FOUND => 'non trovato',
- DB_ERROR_NOT_LOCKED => 'non bloccato',
- DB_ERROR_SYNTAX => 'errore di sintassi',
- DB_ERROR_UNSUPPORTED => 'non supportato',
- DB_ERROR_VALUE_COUNT_ON_ROW => 'valore inserito troppo grande per una colonna',
- DB_ERROR_INVALID_DSN => 'DSN non valido',
- DB_ERROR_CONNECT_FAILED => 'connessione fallita',
- 0 => 'nessun errore', // DB_OK
- DB_ERROR_NEED_MORE_DATA => 'dati inseriti insufficienti',
- DB_ERROR_EXTENSION_NOT_FOUND=> 'estensione non trovata',
- DB_ERROR_NOSUCHDB => 'database non trovato',
- DB_ERROR_ACCESS_VIOLATION => 'permessi insufficienti'
-);
+ 'it',
+ DB_ERROR => 'errore sconosciuto',
+ DB_ERROR_ALREADY_EXISTS => 'esiste già',
+ DB_ERROR_CANNOT_CREATE => 'non posso creare',
+ DB_ERROR_CANNOT_DELETE => 'non posso cancellare',
+ DB_ERROR_CANNOT_DROP => 'non posso eliminare',
+ DB_ERROR_CONSTRAINT => 'violazione constraint',
+ DB_ERROR_DIVZERO => 'divisione per zero',
+ DB_ERROR_INVALID => 'non valido',
+ DB_ERROR_INVALID_DATE => 'data od ora non valida',
+ DB_ERROR_INVALID_NUMBER => 'numero non valido',
+ DB_ERROR_MISMATCH => 'diversi',
+ DB_ERROR_NODBSELECTED => 'nessun database selezionato',
+ DB_ERROR_NOSUCHFIELD => 'nessun campo trovato',
+ DB_ERROR_NOSUCHTABLE => 'nessuna tabella trovata',
+ DB_ERROR_NOT_CAPABLE => 'DB backend non abilitato',
+ DB_ERROR_NOT_FOUND => 'non trovato',
+ DB_ERROR_NOT_LOCKED => 'non bloccato',
+ DB_ERROR_SYNTAX => 'errore di sintassi',
+ DB_ERROR_UNSUPPORTED => 'non supportato',
+ DB_ERROR_VALUE_COUNT_ON_ROW => 'valore inserito troppo grande per una colonna',
+ DB_ERROR_INVALID_DSN => 'DSN non valido',
+ DB_ERROR_CONNECT_FAILED => 'connessione fallita',
+ 0 => 'nessun errore', // DB_OK
+ DB_ERROR_NEED_MORE_DATA => 'dati inseriti insufficienti',
+ DB_ERROR_EXTENSION_NOT_FOUND=> 'estensione non trovata',
+ DB_ERROR_NOSUCHDB => 'database non trovato',
+ DB_ERROR_ACCESS_VIOLATION => 'permessi insufficienti'
+);
?>
\ No newline at end of file
diff --git a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-ru1251.inc.php b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-ru1251.inc.php
index 3a20538..e273f42 100755
--- a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-ru1251.inc.php
+++ b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-ru1251.inc.php
@@ -1,35 +1,35 @@
- 'ru1251',
- DB_ERROR => ' ',
- DB_ERROR_ALREADY_EXISTS => ' ',
- DB_ERROR_CANNOT_CREATE => ' ',
- DB_ERROR_CANNOT_DELETE => ' ',
- DB_ERROR_CANNOT_DROP => ' (drop)',
- DB_ERROR_CONSTRAINT => ' ',
- DB_ERROR_DIVZERO => ' 0',
- DB_ERROR_INVALID => '',
- DB_ERROR_INVALID_DATE => ' ',
- DB_ERROR_INVALID_NUMBER => ' ',
- DB_ERROR_MISMATCH => '',
- DB_ERROR_NODBSELECTED => ' ',
- DB_ERROR_NOSUCHFIELD => ' ',
- DB_ERROR_NOSUCHTABLE => ' ',
- DB_ERROR_NOT_CAPABLE => ' ',
- DB_ERROR_NOT_FOUND => ' ',
- DB_ERROR_NOT_LOCKED => ' ',
- DB_ERROR_SYNTAX => ' ',
- DB_ERROR_UNSUPPORTED => ' ',
- DB_ERROR_VALUE_COUNT_ON_ROW => ' ',
- DB_ERROR_INVALID_DSN => ' DSN',
- DB_ERROR_CONNECT_FAILED => ' ',
- 0 => ' ', // DB_OK
- DB_ERROR_NEED_MORE_DATA => ' ',
- DB_ERROR_EXTENSION_NOT_FOUND=> ' ',
- DB_ERROR_NOSUCHDB => ' ',
- DB_ERROR_ACCESS_VIOLATION => ' '
-);
+ 'ru1251',
+ DB_ERROR => ' ',
+ DB_ERROR_ALREADY_EXISTS => ' ',
+ DB_ERROR_CANNOT_CREATE => ' ',
+ DB_ERROR_CANNOT_DELETE => ' ',
+ DB_ERROR_CANNOT_DROP => ' (drop)',
+ DB_ERROR_CONSTRAINT => ' ',
+ DB_ERROR_DIVZERO => ' 0',
+ DB_ERROR_INVALID => '',
+ DB_ERROR_INVALID_DATE => ' ',
+ DB_ERROR_INVALID_NUMBER => ' ',
+ DB_ERROR_MISMATCH => '',
+ DB_ERROR_NODBSELECTED => ' ',
+ DB_ERROR_NOSUCHFIELD => ' ',
+ DB_ERROR_NOSUCHTABLE => ' ',
+ DB_ERROR_NOT_CAPABLE => ' ',
+ DB_ERROR_NOT_FOUND => ' ',
+ DB_ERROR_NOT_LOCKED => ' ',
+ DB_ERROR_SYNTAX => ' ',
+ DB_ERROR_UNSUPPORTED => ' ',
+ DB_ERROR_VALUE_COUNT_ON_ROW => ' ',
+ DB_ERROR_INVALID_DSN => ' DSN',
+ DB_ERROR_CONNECT_FAILED => ' ',
+ 0 => ' ', // DB_OK
+ DB_ERROR_NEED_MORE_DATA => ' ',
+ DB_ERROR_EXTENSION_NOT_FOUND=> ' ',
+ DB_ERROR_NOSUCHDB => ' ',
+ DB_ERROR_ACCESS_VIOLATION => ' '
+);
?>
\ No newline at end of file
diff --git a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-sv.inc.php b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-sv.inc.php
index a9fd698..64a5b4b 100755
--- a/restrict/plugins/DBMapping/data/adodb5/lang/adodb-sv.inc.php
+++ b/restrict/plugins/DBMapping/data/adodb5/lang/adodb-sv.inc.php
@@ -1,33 +1,33 @@
- 'en',
- DB_ERROR => 'Oknt fel',
- DB_ERROR_ALREADY_EXISTS => 'finns redan',
- DB_ERROR_CANNOT_CREATE => 'kan inte skapa',
- DB_ERROR_CANNOT_DELETE => 'kan inte ta bort',
- DB_ERROR_CANNOT_DROP => 'kan inte slppa',
- DB_ERROR_CONSTRAINT => 'begrnsning krnkt',
- DB_ERROR_DIVZERO => 'division med noll',
- DB_ERROR_INVALID => 'ogiltig',
- DB_ERROR_INVALID_DATE => 'ogiltigt datum eller tid',
- DB_ERROR_INVALID_NUMBER => 'ogiltigt tal',
- DB_ERROR_MISMATCH => 'felaktig matchning',
- DB_ERROR_NODBSELECTED => 'ingen databas vald',
- DB_ERROR_NOSUCHFIELD => 'inget sdant flt',
- DB_ERROR_NOSUCHTABLE => 'ingen sdan tabell',
- DB_ERROR_NOT_CAPABLE => 'DB backend klarar det inte',
- DB_ERROR_NOT_FOUND => 'finns inte',
- DB_ERROR_NOT_LOCKED => 'inte lst',
- DB_ERROR_SYNTAX => 'syntaxfel',
- DB_ERROR_UNSUPPORTED => 'stds ej',
- DB_ERROR_VALUE_COUNT_ON_ROW => 'vrde rknat p rad',
- DB_ERROR_INVALID_DSN => 'ogiltig DSN',
- DB_ERROR_CONNECT_FAILED => 'anslutning misslyckades',
- 0 => 'inget fel', // DB_OK
- DB_ERROR_NEED_MORE_DATA => 'otillrckligt med data angivet',
- DB_ERROR_EXTENSION_NOT_FOUND=> 'utkning hittades ej',
- DB_ERROR_NOSUCHDB => 'ingen sdan databas',
- DB_ERROR_ACCESS_VIOLATION => 'otillrckliga rttigheter'
-);
+ 'en',
+ DB_ERROR => 'Oknt fel',
+ DB_ERROR_ALREADY_EXISTS => 'finns redan',
+ DB_ERROR_CANNOT_CREATE => 'kan inte skapa',
+ DB_ERROR_CANNOT_DELETE => 'kan inte ta bort',
+ DB_ERROR_CANNOT_DROP => 'kan inte slppa',
+ DB_ERROR_CONSTRAINT => 'begrnsning krnkt',
+ DB_ERROR_DIVZERO => 'division med noll',
+ DB_ERROR_INVALID => 'ogiltig',
+ DB_ERROR_INVALID_DATE => 'ogiltigt datum eller tid',
+ DB_ERROR_INVALID_NUMBER => 'ogiltigt tal',
+ DB_ERROR_MISMATCH => 'felaktig matchning',
+ DB_ERROR_NODBSELECTED => 'ingen databas vald',
+ DB_ERROR_NOSUCHFIELD => 'inget sdant flt',
+ DB_ERROR_NOSUCHTABLE => 'ingen sdan tabell',
+ DB_ERROR_NOT_CAPABLE => 'DB backend klarar det inte',
+ DB_ERROR_NOT_FOUND => 'finns inte',
+ DB_ERROR_NOT_LOCKED => 'inte lst',
+ DB_ERROR_SYNTAX => 'syntaxfel',
+ DB_ERROR_UNSUPPORTED => 'stds ej',
+ DB_ERROR_VALUE_COUNT_ON_ROW => 'vrde rknat p rad',
+ DB_ERROR_INVALID_DSN => 'ogiltig DSN',
+ DB_ERROR_CONNECT_FAILED => 'anslutning misslyckades',
+ 0 => 'inget fel', // DB_OK
+ DB_ERROR_NEED_MORE_DATA => 'otillrckligt med data angivet',
+ DB_ERROR_EXTENSION_NOT_FOUND=> 'utkning hittades ej',
+ DB_ERROR_NOSUCHDB => 'ingen sdan databas',
+ DB_ERROR_ACCESS_VIOLATION => 'otillrckliga rttigheter'
+);
?>
\ No newline at end of file
diff --git a/restrict/plugins/DBMapping/data/adodb5/license.txt b/restrict/plugins/DBMapping/data/adodb5/license.txt
index 2353871..9821fcb 100755
--- a/restrict/plugins/DBMapping/data/adodb5/license.txt
+++ b/restrict/plugins/DBMapping/data/adodb5/license.txt
@@ -1,182 +1,182 @@
-ADOdb is dual licensed using BSD and LGPL.
-
-In plain English, you do not need to distribute your application in source code form, nor do you need to distribute ADOdb source code, provided you follow the rest of terms of the BSD license.
-
-For more info about ADOdb, visit http://adodb.sourceforge.net/
-
-BSD Style-License
-=================
-
-Copyright (c) 2000, 2001, 2002, 2003, 2004 John Lim
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this list
-of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice, this list
-of conditions and the following disclaimer in the documentation and/or other materials
-provided with the distribution.
-
-Neither the name of the John Lim nor the names of its contributors may be used to
-endorse or promote products derived from this software without specific prior written
-permission.
-
-DISCLAIMER:
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
-JOHN LIM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-==========================================================
-GNU LESSER GENERAL PUBLIC LICENSE
-Version 2.1, February 1999
-
-Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-
-Preamble
-The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
-
-This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
-
-When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
-
-To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
-
-For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
-
-We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
-
-To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
-
-Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
-
-Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
-
-When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
-
-We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
-
-For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
-
-In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
-
-Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
-
-The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
-
-
-TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
-
-A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
-
-The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
-
-"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
-
-Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
-
-1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
-
-You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
-
-2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
-
-
-a) The modified work must itself be a software library.
-b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
-c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
-d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
-(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
-
-3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
-
-Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
-
-This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
-
-4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
-
-If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
-
-5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
-
-However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
-
-When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
-
-If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
-
-Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
-
-6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
-
-You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
-
-
-a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
-b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
-c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
-d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
-e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
-For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
-
-It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
-
-7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
-
-
-a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
-b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
-8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
-
-9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
-
-10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
-
-11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
-
-This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
-
-12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
-
-13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
-
-14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
-
-NO WARRANTY
-
-15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-
+ADOdb is dual licensed using BSD and LGPL.
+
+In plain English, you do not need to distribute your application in source code form, nor do you need to distribute ADOdb source code, provided you follow the rest of terms of the BSD license.
+
+For more info about ADOdb, visit http://adodb.sourceforge.net/
+
+BSD Style-License
+=================
+
+Copyright (c) 2000, 2001, 2002, 2003, 2004 John Lim
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list
+of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list
+of conditions and the following disclaimer in the documentation and/or other materials
+provided with the distribution.
+
+Neither the name of the John Lim nor the names of its contributors may be used to
+endorse or promote products derived from this software without specific prior written
+permission.
+
+DISCLAIMER:
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+JOHN LIM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+==========================================================
+GNU LESSER GENERAL PUBLIC LICENSE
+Version 2.1, February 1999
+
+Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+
+Preamble
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
+
+This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
+
+When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
+
+To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
+
+For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
+
+We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
+
+To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
+
+Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
+
+Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
+
+When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
+
+We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
+
+For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
+
+In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
+
+Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
+
+The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
+
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
+
+A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
+
+The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
+
+"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
+
+1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+
+a) The modified work must itself be a software library.
+b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
+c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
+d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
+(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
+
+Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
+
+This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
+
+4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
+
+If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
+
+5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
+
+However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
+
+When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
+
+If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
+
+Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
+
+6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
+
+You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
+
+
+a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
+b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
+c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
+d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
+e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
+For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
+
+7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
+
+
+a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
+b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
+8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
+
+10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
+
+11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
+
+14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+
END OF TERMS AND CONDITIONS
\ No newline at end of file
diff --git a/restrict/plugins/DBMapping/data/adodb5/pear/readme.Auth.txt b/restrict/plugins/DBMapping/data/adodb5/pear/readme.Auth.txt
index db28319..b6b0c15 100755
--- a/restrict/plugins/DBMapping/data/adodb5/pear/readme.Auth.txt
+++ b/restrict/plugins/DBMapping/data/adodb5/pear/readme.Auth.txt
@@ -1,20 +1,20 @@
-From: Rich Tango-Lowy (richtl#arscognita.com)
-Date: Sat, May 29, 2004 11:20 am
-
-OK, I hacked out an ADOdb container for PEAR-Auth. The error handling's
-a bit of a mess, but all the methods work.
-
-Copy ADOdb.php to your pear/Auth/Container/ directory.
-
-Use the ADOdb container exactly as you would the DB
-container, but specify 'ADOdb' instead of 'DB':
-
-$dsn = "mysql://myuser:mypass@localhost/authdb";
-$a = new Auth("ADOdb", $dsn, "loginFunction");
-
-
--------------------
-
-John Lim adds:
-
-See http://pear.php.net/manual/en/package.authentication.php
+From: Rich Tango-Lowy (richtl#arscognita.com)
+Date: Sat, May 29, 2004 11:20 am
+
+OK, I hacked out an ADOdb container for PEAR-Auth. The error handling's
+a bit of a mess, but all the methods work.
+
+Copy ADOdb.php to your pear/Auth/Container/ directory.
+
+Use the ADOdb container exactly as you would the DB
+container, but specify 'ADOdb' instead of 'DB':
+
+$dsn = "mysql://myuser:mypass@localhost/authdb";
+$a = new Auth("ADOdb", $dsn, "loginFunction");
+
+
+-------------------
+
+John Lim adds:
+
+See http://pear.php.net/manual/en/package.authentication.php
diff --git a/restrict/plugins/DBMapping/data/adodb5/readme.txt b/restrict/plugins/DBMapping/data/adodb5/readme.txt
index 97bdd9e..009b94c 100755
--- a/restrict/plugins/DBMapping/data/adodb5/readme.txt
+++ b/restrict/plugins/DBMapping/data/adodb5/readme.txt
@@ -1,62 +1,62 @@
->> ADODB Library for PHP4
-
-(c) 2000-2004 John Lim (jlim@natsoft.com.my)
-
-Released under both BSD and GNU Lesser GPL library license.
-This means you can use it in proprietary products.
-
-
->> Introduction
-
-PHP's database access functions are not standardised. This creates a
-need for a database class library to hide the differences between the
-different databases (encapsulate the differences) so we can easily
-switch databases.
-
-We currently support MySQL, Interbase, Sybase, PostgreSQL, Oracle,
-Microsoft SQL server, Foxpro ODBC, Access ODBC, Informix, DB2,
-Sybase SQL Anywhere, generic ODBC and Microsoft's ADO.
-
-We hope more people will contribute drivers to support other databases.
-
-
->> Documentation and Examples
-
-Refer to the adodb/docs directory for full documentation and examples.
-There is also a tutorial tute.htm that contrasts ADODB code with
-mysql code.
-
-
->>> Files
-Adodb.inc.php is the main file. You need to include only this file.
-
-Adodb-*.inc.php are the database specific driver code.
-
-Test.php contains a list of test commands to exercise the class library.
-
-Adodb-session.php is the PHP4 session handling code.
-
-Testdatabases.inc.php contains the list of databases to apply the tests on.
-
-Benchmark.php is a simple benchmark to test the throughput of a simple SELECT
-statement for databases described in testdatabases.inc.php. The benchmark
-tables are created in test.php.
-
-readme.htm is the main documentation.
-
-tute.htm is the tutorial.
-
-
->> More Info
-
-For more information, including installation see readme.htm
-or visit
- http://adodb.sourceforge.net/
-
-
->> Feature Requests and Bug Reports
-
-Email to jlim@natsoft.com.my
-
-
+>> ADODB Library for PHP4
+
+(c) 2000-2004 John Lim (jlim@natsoft.com.my)
+
+Released under both BSD and GNU Lesser GPL library license.
+This means you can use it in proprietary products.
+
+
+>> Introduction
+
+PHP's database access functions are not standardised. This creates a
+need for a database class library to hide the differences between the
+different databases (encapsulate the differences) so we can easily
+switch databases.
+
+We currently support MySQL, Interbase, Sybase, PostgreSQL, Oracle,
+Microsoft SQL server, Foxpro ODBC, Access ODBC, Informix, DB2,
+Sybase SQL Anywhere, generic ODBC and Microsoft's ADO.
+
+We hope more people will contribute drivers to support other databases.
+
+
+>> Documentation and Examples
+
+Refer to the adodb/docs directory for full documentation and examples.
+There is also a tutorial tute.htm that contrasts ADODB code with
+mysql code.
+
+
+>>> Files
+Adodb.inc.php is the main file. You need to include only this file.
+
+Adodb-*.inc.php are the database specific driver code.
+
+Test.php contains a list of test commands to exercise the class library.
+
+Adodb-session.php is the PHP4 session handling code.
+
+Testdatabases.inc.php contains the list of databases to apply the tests on.
+
+Benchmark.php is a simple benchmark to test the throughput of a simple SELECT
+statement for databases described in testdatabases.inc.php. The benchmark
+tables are created in test.php.
+
+readme.htm is the main documentation.
+
+tute.htm is the tutorial.
+
+
+>> More Info
+
+For more information, including installation see readme.htm
+or visit
+ http://adodb.sourceforge.net/
+
+
+>> Feature Requests and Bug Reports
+
+Email to jlim@natsoft.com.my
+
+
\ No newline at end of file
diff --git a/restrict/plugins/DBMapping/data/adodb5/session/adodb-encrypt-sha1.php b/restrict/plugins/DBMapping/data/adodb5/session/adodb-encrypt-sha1.php
index 16f603e..0884af6 100755
--- a/restrict/plugins/DBMapping/data/adodb5/session/adodb-encrypt-sha1.php
+++ b/restrict/plugins/DBMapping/data/adodb5/session/adodb-encrypt-sha1.php
@@ -1,32 +1,32 @@
-encrypt($data, $key);
-
- }
-
-
- function read($data, $key)
- {
- $sha1crypt = new SHA1Crypt();
- return $sha1crypt->decrypt($data, $key);
-
- }
-}
-
-
-
-return 1;
+encrypt($data, $key);
+
+ }
+
+
+ function read($data, $key)
+ {
+ $sha1crypt = new SHA1Crypt();
+ return $sha1crypt->decrypt($data, $key);
+
+ }
+}
+
+
+
+return 1;
?>
\ No newline at end of file
diff --git a/restrict/plugins/DBMapping/data/adodb5/session/adodb-sess.txt b/restrict/plugins/DBMapping/data/adodb5/session/adodb-sess.txt
index d23dac4..c6c7685 100755
--- a/restrict/plugins/DBMapping/data/adodb5/session/adodb-sess.txt
+++ b/restrict/plugins/DBMapping/data/adodb5/session/adodb-sess.txt
@@ -1,131 +1,131 @@
-John,
-
-I have been an extremely satisfied ADODB user for several years now.
-
-To give you something back for all your hard work, I've spent the last 3
-days rewriting the adodb-session.php code.
-
-----------
-What's New
-----------
-
-Here's a list of the new code's benefits:
-
-* Combines the functionality of the three files:
-
-adodb-session.php
-adodb-session-clob.php
-adodb-cryptsession.php
-
-each with very similar functionality, into a single file adodb-session.php.
-This will ease maintenance and support issues.
-
-* Supports multiple encryption and compression schemes.
- Currently, we support:
-
- MD5Crypt (crypt.inc.php)
- MCrypt
- Secure (Horde's emulation of MCrypt, if MCrypt module is not available.)
- GZip
- BZip2
-
-These can be stacked, so if you want to compress and then encrypt your
-session data, it's easy.
-Also, the built-in MCrypt functions will be *much* faster, and more secure,
-than the MD5Crypt code.
-
-* adodb-session.php contains a single class ADODB_Session that encapsulates
-all functionality.
- This eliminates the use of global vars and defines (though they are
-supported for backwards compatibility).
-
-* All user defined parameters are now static functions in the ADODB_Session
-class.
-
-New parameters include:
-
-* encryptionKey(): Define the encryption key used to encrypt the session.
-Originally, it was a hard coded string.
-
-* persist(): Define if the database will be opened in persistent mode.
-Originally, the user had to call adodb_sess_open().
-
-* dataFieldName(): Define the field name used to store the session data, as
-'DATA' appears to be a reserved word in the following cases:
- ANSI SQL
- IBM DB2
- MS SQL Server
- Postgres
- SAP
-
-* filter(): Used to support multiple, simulataneous encryption/compression
-schemes.
-
-* Debug support is improved thru _rsdump() function, which is called after
-every database call.
-
-------------
-What's Fixed
-------------
-
-The new code includes several bug fixes and enhancements:
-
-* sesskey is compared in BINARY mode for MySQL, to avoid problems with
-session keys that differ only by case.
- Of course, the user should define the sesskey field as BINARY, to
-correctly fix this problem, otherwise performance will suffer.
-
-* In ADODB_Session::gc(), if $expire_notify is true, the multiple DELETES in
-the original code have been optimized to a single DELETE.
-
-* In ADODB_Session::destroy(), since "SELECT expireref, sesskey FROM $table
-WHERE sesskey = $qkey" will only return a single value, we don't loop on the
-result, we simply process the row, if any.
-
-* We close $rs after every use.
-
----------------
-What's the Same
----------------
-
-I know backwards compatibility is *very* important to you. Therefore, the
-new code is 100% backwards compatible.
-
-If you like my code, but don't "trust" it's backwards compatible, maybe we
-offer it as beta code, in a new directory for a release or two?
-
-------------
-What's To Do
-------------
-
-I've vascillated over whether to use a single function to get/set
-parameters:
-
-$user = ADODB_Session::user(); // get
-ADODB_Session::user($user); // set
-
-or to use separate functions (which is the PEAR/Java way):
-
-$user = ADODB_Session::getUser();
-ADODB_Session::setUser($user);
-
-I've chosen the former as it's makes for a simpler API, and reduces the
-amount of code, but I'd be happy to change it to the latter.
-
-Also, do you think the class should be a singleton class, versus a static
-class?
-
-Let me know if you find this code useful, and will be including it in the
-next release of ADODB.
-
-If so, I will modify the current documentation to detail the new
-functionality. To that end, what file(s) contain the documentation? Please
-send them to me if they are not publically available.
-
-Also, if there is *anything* in the code that you like to see changed, let
-me know.
-
-Thanks,
-
-Ross
-
+John,
+
+I have been an extremely satisfied ADODB user for several years now.
+
+To give you something back for all your hard work, I've spent the last 3
+days rewriting the adodb-session.php code.
+
+----------
+What's New
+----------
+
+Here's a list of the new code's benefits:
+
+* Combines the functionality of the three files:
+
+adodb-session.php
+adodb-session-clob.php
+adodb-cryptsession.php
+
+each with very similar functionality, into a single file adodb-session.php.
+This will ease maintenance and support issues.
+
+* Supports multiple encryption and compression schemes.
+ Currently, we support:
+
+ MD5Crypt (crypt.inc.php)
+ MCrypt
+ Secure (Horde's emulation of MCrypt, if MCrypt module is not available.)
+ GZip
+ BZip2
+
+These can be stacked, so if you want to compress and then encrypt your
+session data, it's easy.
+Also, the built-in MCrypt functions will be *much* faster, and more secure,
+than the MD5Crypt code.
+
+* adodb-session.php contains a single class ADODB_Session that encapsulates
+all functionality.
+ This eliminates the use of global vars and defines (though they are
+supported for backwards compatibility).
+
+* All user defined parameters are now static functions in the ADODB_Session
+class.
+
+New parameters include:
+
+* encryptionKey(): Define the encryption key used to encrypt the session.
+Originally, it was a hard coded string.
+
+* persist(): Define if the database will be opened in persistent mode.
+Originally, the user had to call adodb_sess_open().
+
+* dataFieldName(): Define the field name used to store the session data, as
+'DATA' appears to be a reserved word in the following cases:
+ ANSI SQL
+ IBM DB2
+ MS SQL Server
+ Postgres
+ SAP
+
+* filter(): Used to support multiple, simulataneous encryption/compression
+schemes.
+
+* Debug support is improved thru _rsdump() function, which is called after
+every database call.
+
+------------
+What's Fixed
+------------
+
+The new code includes several bug fixes and enhancements:
+
+* sesskey is compared in BINARY mode for MySQL, to avoid problems with
+session keys that differ only by case.
+ Of course, the user should define the sesskey field as BINARY, to
+correctly fix this problem, otherwise performance will suffer.
+
+* In ADODB_Session::gc(), if $expire_notify is true, the multiple DELETES in
+the original code have been optimized to a single DELETE.
+
+* In ADODB_Session::destroy(), since "SELECT expireref, sesskey FROM $table
+WHERE sesskey = $qkey" will only return a single value, we don't loop on the
+result, we simply process the row, if any.
+
+* We close $rs after every use.
+
+---------------
+What's the Same
+---------------
+
+I know backwards compatibility is *very* important to you. Therefore, the
+new code is 100% backwards compatible.
+
+If you like my code, but don't "trust" it's backwards compatible, maybe we
+offer it as beta code, in a new directory for a release or two?
+
+------------
+What's To Do
+------------
+
+I've vascillated over whether to use a single function to get/set
+parameters:
+
+$user = ADODB_Session::user(); // get
+ADODB_Session::user($user); // set
+
+or to use separate functions (which is the PEAR/Java way):
+
+$user = ADODB_Session::getUser();
+ADODB_Session::setUser($user);
+
+I've chosen the former as it's makes for a simpler API, and reduces the
+amount of code, but I'd be happy to change it to the latter.
+
+Also, do you think the class should be a singleton class, versus a static
+class?
+
+Let me know if you find this code useful, and will be including it in the
+next release of ADODB.
+
+If so, I will modify the current documentation to detail the new
+functionality. To that end, what file(s) contain the documentation? Please
+send them to me if they are not publically available.
+
+Also, if there is *anything* in the code that you like to see changed, let
+me know.
+
+Thanks,
+
+Ross
+
diff --git a/restrict/plugins/DBMapping/data/adodb5/tests/pdo.php b/restrict/plugins/DBMapping/data/adodb5/tests/pdo.php
index e4c1a46..b66018f 100755
--- a/restrict/plugins/DBMapping/data/adodb5/tests/pdo.php
+++ b/restrict/plugins/DBMapping/data/adodb5/tests/pdo.php
@@ -1,94 +1,94 @@
-";
-try {
- echo "New Connection\n";
-
-
- $dsn = 'pdo_mysql://root:@localhost/northwind?persist';
-
- if (!empty($dsn)) {
- $DB = NewADOConnection($dsn) || die("CONNECT FAILED");
- $connstr = $dsn;
- } else {
-
- $DB = NewADOConnection('pdo');
-
- echo "Connect\n";
-
- $u = ''; $p = '';
- /*
- $connstr = 'odbc:nwind';
-
- $connstr = 'oci:';
- $u = 'scott';
- $p = 'natsoft';
-
-
- $connstr ="sqlite:d:\inetpub\adodb\sqlite.db";
- */
-
- $connstr = "mysql:dbname=northwind";
- $u = 'root';
-
- $connstr = "pgsql:dbname=test";
- $u = 'tester';
- $p = 'test';
-
- $DB->Connect($connstr,$u,$p) || die("CONNECT FAILED");
-
- }
-
- echo "connection string=$connstr\n Execute\n";
-
- //$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
- $rs = $DB->Execute("select * from ADOXYZ where id<3");
- if ($DB->ErrorNo()) echo "*** errno=".$DB->ErrorNo() . " ".($DB->ErrorMsg())."\n";
-
-
- //print_r(get_class_methods($DB->_stmt));
-
- if (!$rs) die("NO RS");
-
- echo "Meta\n";
- for ($i=0; $i < $rs->NumCols(); $i++) {
- var_dump($rs->FetchField($i));
- echo " ";
- }
-
- echo "FETCH\n";
- $cnt = 0;
- while (!$rs->EOF) {
- adodb_pr($rs->fields);
- $rs->MoveNext();
- if ($cnt++ > 1000) break;
- }
-
- echo " -------------------------------------------------------- \n\n\n";
-
- $stmt = $DB->PrepareStmt("select * from ADOXYZ");
-
- $rs = $stmt->Execute();
- $cols = $stmt->NumCols(); // execute required
-
- echo "COLS = $cols";
- for($i=1;$i<=$cols;$i++) {
- $v = $stmt->_stmt->getColumnMeta($i);
- var_dump($v);
- }
-
- echo "e=".$stmt->ErrorNo() . " ".($stmt->ErrorMsg())."\n";
- while ($arr = $rs->FetchRow()) {
- adodb_pr($arr);
- }
- die("DONE\n");
-
-} catch (exception $e) {
- echo "