<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Oracle Berkeley DB 中国研发团队的博客 &#187; 赵汝聪</title>
	<atom:link href="http://www.bdbchina.com/author/rucongzhao/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bdbchina.com</link>
	<description>Oracle Berkeley DB 中国研发团队的博客</description>
	<lastBuildDate>Fri, 09 Jul 2010 06:44:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>在UNIX环境下使用DBSQL作为FireFox/SQLite Manager的底层存储引擎</title>
		<link>http://www.bdbchina.com/2010/06/%e5%9c%a8unix%e7%8e%af%e5%a2%83%e4%b8%8b%e4%bd%bf%e7%94%a8dbsql%e4%bd%9c%e4%b8%bafirefoxsqlite-manager%e7%9a%84%e5%ba%95%e5%b1%82%e5%ad%98%e5%82%a8%e5%bc%95%e6%93%8e/</link>
		<comments>http://www.bdbchina.com/2010/06/%e5%9c%a8unix%e7%8e%af%e5%a2%83%e4%b8%8b%e4%bd%bf%e7%94%a8dbsql%e4%bd%9c%e4%b8%bafirefoxsqlite-manager%e7%9a%84%e5%ba%95%e5%b1%82%e5%ad%98%e5%82%a8%e5%bc%95%e6%93%8e/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 21:59:15 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[DBSQL]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[SQLite]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1305</guid>
		<description><![CDATA[本文介绍如何在UNIX/Linux环境下将FireFox/SQLite Manager的底层存储引擎由SQLite转换为DBSQL.本博客介绍的过程同样也可推及到Google Chrome等使用SQLite作为存储引擎的优秀开源软件.
本文假定您已经根据在unixlinux平台上应用berkeley db 11gr2sql成功编译了DBSQL.
最后,需要特别强调的是,在做存储引擎转换和数据迁移前,必须做好用户数据的备份,以防操作不慎或其它意外造成的数据损坏.

 Firefox 3.6 on Linux 
Firefox distributions do not link to external/system sqlite3 lib. So we have to rebuild firefox from source code to force it to link system sqlite3 by &#8220;&#8211;enable-system-sqlite&#8221;
 1. Install sqlite-3.6.22 
We need original sqlite3 because we have to migrate existing database.
Download http://www.sqlite.org/sqlite-3.6.22.tar.gz

tar zxf sqlite-3.6.22.tar.gz
env CFLAGS="-DSQLITE_SECURE_DELETE=1" ./configure [...]]]></description>
			<content:encoded><![CDATA[<p>本文介绍如何在UNIX/Linux环境下将FireFox/SQLite Manager的底层存储引擎由SQLite转换为DBSQL.本博客介绍的过程同样也可推及到Google Chrome等使用SQLite作为存储引擎的优秀开源软件.</p>
<p>本文假定您已经根据<a href="http://www.bdbchina.com/2010/04/在unixlinux平台上应用berkeley-db-11gr2-sql/">在unixlinux平台上应用berkeley db 11gr2sql</a>成功编译了DBSQL.</p>
<p>最后,需要特别强调的是,在做存储引擎转换和数据迁移前,必须做好用户数据的备份,以防操作不慎或其它意外造成的数据损坏.</p>
<p><span id="more-1305"></span></p>
<h2> Firefox 3.6 on Linux </h2>
<p>Firefox distributions do not link to external/system sqlite3 lib. So we have to rebuild firefox from source code to force it to link system sqlite3 by &#8220;&#8211;enable-system-sqlite&#8221;</p>
<p><strong> 1. Install sqlite-3.6.22 </strong><br />
We need original sqlite3 because we have to migrate existing database.</p>
<p>Download http://www.sqlite.org/sqlite-3.6.22.tar.gz</p>
<pre>
tar zxf sqlite-3.6.22.tar.gz
env CFLAGS="-DSQLITE_SECURE_DELETE=1" ./configure --prefix=/usr
make
sudo make install
</pre>
<p><strong> 2. Build Firefox 3.6 </strong><br />
<strong>Note:This step may replace your system Firefox. Please backup your ~/.mozilla at first.</strong><br />
Get source code</p>
<pre>
mkdir $HOME/src/firefox-3.6
hg clone http://hg.mozilla.org/mozilla-central/ src
cd $HOME/src/firefox-3.6
</pre>
<p>Create a file &#8220;mozconfig&#8221; in current directory. Content of file &#8220;mozconfig&#8221;:</p>
<pre>
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/objdir-ff-release
ac_add_options --enable-system-sqlite
ac_add_options --disable-ogg
ac_add_options --disable-wave
ac_add_options --disable-crashreporter
ac_add_options --disable-necko-wifi
</pre>
<p>Build</p>
<pre>
make -f client.mk
sudo make -f client.mk install
</pre>
<p><strong> 3. Buid BDB SQL </strong><br />
Place up-to-date db source code on $HOME/hg/db_x86</p>
<pre>
cd $HOME/hg/db_x86/build_unix
env CFLAGS="-O3" ../dist/configure --enable-sql_compat --enable-sql
make dbsql &#038;&#038; make install
</pre>
<p><strong> 4. Modify Firefox linking </strong></p>
<pre>
cd /usr/local/lib/firefox-3.7a2pre
sudo ln -sf $HOME/install/lib/libdb_sql-5.0.so libsqlite3.so.0
</pre>
<p><strong> 5. Data Migration </strong><br />
(The directory name on my computer is &#8220;yezkdh8w.default&#8221;. It may be different in your platform)<br />
Here is an example for data migration. Here we just take downloads.sqlite as example. You may need to go through all *.sqlite files:</p>
<pre>
cd ~/.mozilla/firefox/
cp yezkdh8w.default yezkdh8w.default.bak -r # backup
cd yezkdh8w.default
bash ../firefox_convert.sh /usr/bin/sqlite3 /home/rucong/install/bin/dbsql
$ sqlite3 downloads.sqlite
SQLite version 3.6.22
Enter ".help" for instructions
sqlite> .echo ON
sqlite> .output dump
.output dump
sqlite> .dump
.dump
sqlite> .quit
.quit
$ mv downloads.sqlite downloads.sqlite.bak
$ ~/hg/db_x86/build_unix/dbsql downloads.sqlite
Berkeley DB 11g Release 2, library version 11.2.5.0.21: (March 30, 2010)
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
dbsql> .read dump
dbsql> .quit
$ rm dump
</pre>
<p><strong> 6. End </strong><br />
That&#8217;s all. Execute the new Firefox to see how it works.</p>
<hr/>
<h2> SQLite Manager </h2>
<p><strong> 1. Install SQLite Manager </strong><br />
Use above Firefox to visit <a href="https://addons.mozilla.org/en-US/firefox/addon/5817">SQLite Manager Plugin</a> and install it.<br />
Restart Firefox. We can start SQLite Manager by Menu->Tools->SQLite Manager now.</p>
<p><strong> 2. Open a BDB SQL Database </strong></p>
<p><strong>Generate database</strong><br />
Note: The version of BDB SQL has to be the same as the one we applied in Firefox.</p>
<pre>
cd db/build_unix
make ex_sql_binding
./ex_sql_binding
</pre>
<p>Now we get BDB SQL database ex_sql_binding.db.</p>
<p><strong>Use SQLite Manager to open the generated db</strong></p>
<p>Start SQLite Manager to open database db/build_unix/ex_sql_binding.db:<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/05/SQLiteManager.png"><img src="http://www.bdbchina.com/wp-content/uploads/2010/05/SQLiteManager.png" alt="" title="SQLiteManager" width="667" height="353" class="alignnone size-full wp-image-1308" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/06/%e5%9c%a8unix%e7%8e%af%e5%a2%83%e4%b8%8b%e4%bd%bf%e7%94%a8dbsql%e4%bd%9c%e4%b8%bafirefoxsqlite-manager%e7%9a%84%e5%ba%95%e5%b1%82%e5%ad%98%e5%82%a8%e5%bc%95%e6%93%8e/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using DBSQL JDBC Driver in ADF/JDeveloper</title>
		<link>http://www.bdbchina.com/2010/06/using-dbsql-jdbc-driver-in-adfjdeveloper/</link>
		<comments>http://www.bdbchina.com/2010/06/using-dbsql-jdbc-driver-in-adfjdeveloper/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 09:28:17 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[ADF]]></category>
		<category><![CDATA[DBSQL]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[JDeveloper]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1280</guid>
		<description><![CDATA[Oracle 应用程序开发框架 (Oracle ADF) 是一个端到端 J2EE 框架，该框架通过提供现成的基础架构服务和虚拟的声明式开发体验，从而简化了开发。JDeveloper是Oracle公司开发的Java集成开发环境（IDE）。本博客介绍了如何在ADF/JDeveloper中使用DBSQL作为JDBC数据库连接的引擎。
This guide describes how to apply DBSQL JDBC Driver in integrated development environment ADF/JDeveloper step by step.
Environment:

OS: Windows XP 32bit
ADF Business Components: 11.1.1.56.60
Java(TM) Platform: 1.6.0_18
JDeveloper:   11g Release 1(11.1.1.3.0)


 1. Installing the Berkeley DB 

Make sure that the Java environment you apply in the building should be the [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle 应用程序开发框架 (Oracle ADF) 是一个端到端 J2EE 框架，该框架通过提供现成的基础架构服务和虚拟的声明式开发体验，从而简化了开发。JDeveloper是Oracle公司开发的Java集成开发环境（IDE）。本博客介绍了如何在ADF/JDeveloper中使用DBSQL作为JDBC数据库连接的引擎。</p>
<p>This guide describes how to apply DBSQL JDBC Driver in integrated development environment ADF/JDeveloper step by step.<br />
<strong>Environment:</strong></p>
<ul>
<li>OS: Windows XP 32bit</li>
<li>ADF Business Components: 11.1.1.56.60</li>
<li>Java(TM) Platform: 1.6.0_18</li>
<li>JDeveloper:   11g Release 1(11.1.1.3.0)</li>
</ul>
<p><span id="more-1280"></span></p>
<h2> 1. Installing the Berkeley DB </h2>
<ul>
<li>Make sure that the Java environment you apply in the building should be the same as ADF/JDeveloper&#8217;s.</li>
<li>Refer to http://www.oracle.com/technology/documentation/berkeley-db/db/installation/build_win_sql.html for instructions about building JDBC Driver on Windows platform. The Release build option is recommended.</li>
<li>Add the dll path into system <strong>PATH</strong>environment variable, e.g. add D:\jdbc\db-5.0.21\build_windows\Win32\Release to your %PATH%</li>
</ul>
<h2>  2. Create JDBC Connection in JDeveloper </h2>
<p>2.1 Select File->new->General->Connections->Database Connection and fill in the form like Figure 1. Select button &#8220;new&#8221; to create new driver SQLiteJDBCDriver(see following Figure 2).<br />
<strong>Figure 1</strong><br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/05/sc2.png"><img src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc2.png" alt="" title="sc2" width="561" height="560" class="alignnone size-full wp-image-1298" /></a></p>
<p>2.2 Create a new driver SQLiteJDBCDriver. You should back to Figure 1 after clicking button &#8220;OK&#8221;.<br />
<strong>Figure 2</strong><br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/05/sc1.png"><img src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc1.png" alt="" title="sc1" width="854" height="500" class="alignnone size-full wp-image-1299" /></a></p>
<p>2.3 You can use button &#8220;Test Connection&#8221; to test the setting in Figure 1. If you encounter NullPointerException, please refer following section &#8220;Troubleshooting 4.1&#8243;</p>
<p>2.4 Create an empty project(or open an existing project). Select Edit->properties->Libraries Classpath to add the registered DBSQL_JDBC:<br />
<strong>Figure 3</strong><br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/05/sc3.png"><img src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc3.png" alt="" title="sc3" width="700" height="503" class="alignnone size-full wp-image-1300" /></a></p>
<h2> 3. Running the JDBC Sample Code </h2>
<p>This chapter only shows how to run the JDBC samples downloaded from Sun (now belongs to Oracle) Developer Network. You can skip this chapter if you already have a test environment.</p>
<p><strong> 3.1 Downloading JDBC sample code from Sun </strong><br />
You can download the JDBC sample code from Sun Developer Network. See &#8220;JDBC programming examples from all three editions (ZIP format)&#8221; at http://java.sun.com/products/jdbc/reference/codesamples/index.html.</p>
<p><strong>  3.2 Modifications Needed </strong><br />
Create an empty project and add all JDBC sample code into it. You will definitely need to:</p>
<ul>
<li>Replace <strong>Class.forName(&#8220;myDriver.ClassName&#8221;)</strong> in all sample code files with <strong>Class.forName(&#8220;SQLite.JDBCDriver&#8221;)</strong></li>
<li>Replace <strong>&#8220;jdbc:mySubprotocol:myDataSource&#8221;</strong> in all sample code files with <strong>jdbc:sqlite:/D:\\example.db</strong></li>
<li>Change the variable name <strong>&#8220;enum&#8221;</strong> in OutputApplet.java to <strong>&#8220;enum1&#8243;</strong>, since as <strong>&#8220;enum&#8221;</strong> is a keyword in some Java environment, and may not be used as an identifier. Otherwise, you may encounter &#8220;Error(87,31):  as of release 5, &#8216;enum&#8217; is a keyword, and may not be used as an identifier&#8221;</li>
</ul>
<p><strong>  3.3 Running examples </strong> </p>
<table>
<tr>
<td> Example Name </td>
<td> Depended Example Name </td>
</tr>
<tr>
<td> CreateCoffees </td>
<td> None </td>
</tr>
<tr>
<td> InsertCoffees </td>
<td> CreateCoffees </td>
</tr>
<tr>
<td> BatchUpdate </td>
<td> CreateCoffees </td>
</tr>
<tr>
<td> InsertRow </td>
<td> CreateCoffees </td>
</tr>
<tr>
<td> InsertRows </td>
<td> CreateCoffees. This example has an issue: it should execute uprs.moveToInsertRow()  before each uprs.insertRow(). </td>
</tr>
<tr>
<td> RSMetaDataMethods </td>
<td> CreateCoffees </td>
</tr>
<tr>
<td> TransactionPairs </td>
<td> CreateCoffees </td>
</tr>
<tr>
<td> TypeConcurrency </td>
<td> CreateCoffees </td>
</tr>
<tr>
<td> PrintColumns </td>
<td> CreateCoffees(or InsertCoffees, or BatchUpdate) </td>
</tr>
<tr>
<td> OutputApplet </td>
<td> CreateCoffees(or InsertCoffees, or BatchUpdate). This example also require AppletViewer environment. </td>
</tr>
<tr>
<td> CreateSuppliers </td>
<td> None </td>
</tr>
<tr>
<td> InsertSuppliers </td>
<td> CreateSuppliers </td>
</tr>
<tr>
<td> Join </td>
<td> InsertCoffees(or BatchUpdate) and InsertSuppliers </td>
</tr>
<tr>
<td> SQLStatement </td>
<td> InsertCoffees(or BatchUpdate) and InsertSuppliers </td>
</tr>
<tr>
<td> PrimaryKeysSuppliers </td>
<td> None </td>
</tr>
<tr>
<td> ForeignKeysCoffees </td>
<td> None </td>
</tr>
<tr>
<td> TypeInfo </td>
<td> None </td>
</tr>
<tr>
<td> TableTypes </td>
<td> None </td>
</tr>
</table>
<p>Other examples does not work because BDSQL JDBC driver does not support User-defined type or something like that.</p>
<p>Take SQLStatement.java for example, since it depends on &#8220;InsertCoffees(or BatchUpdate) and InsertSuppliers&#8221;, further more, &#8220;InsertCoffees(or BatchUpdate)&#8221; again depends on &#8220;CreateCoffees&#8221;, and &#8220;InsertSuppliers&#8221; depends on &#8220;CreateSuppliers&#8221;, so one reasonable sequence to run the SQLStatement example looks like this:</p>
<pre>
Execute CreateCoffee.java
Execute CreateSuppliers.java
Execute InsertCoffee.java
Execute InsertSuppliers.java
Execute SQLStatement.java
</pre>
<p>Finally, we can get result like below:</p>
<pre>
Row 1:
   Column 1:  Acme, Inc.
   Column 2:  Colombian

Row 2:
   Column 1:  Acme, Inc.
   Column 2:  Colombian_Decaf

Process exited with exit code 0.
</pre>
<p>Here is a screenshot of the execution result of the SQLStatement<br />
<strong>Figure 4</strong><br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/05/sc5.png"><img src="http://www.bdbchina.com/wp-content/uploads/2010/05/sc5.png" alt="" title="sc5" width="640" height="467" class="alignnone size-full wp-image-1301" /></a></p>
<h2> 4. Troubleshooting </h2>
<p><strong> 4.1 Edit db_sql_jdbc.vsproj for different JDK environemt </strong><br />
If you encounter one of following issues:</p>
<ul>
<li> Encounter NullPointerException in JDeveloper JDBCconnection testing(figure 1)</li>
<li> Hits &#8220;ClassNotFoundException: SQLite.JDBC2x.JDBCConnection&#8221; when executing Java programs. </li>
</ul>
<p>That means that your Java environment requires JDBC2x.* instead of JDBC2z.*. So you need to edit build_windows/ex_sql_jdbc.vcproj, replace all JDBC2z with JDBC2x and rebuild the project (ex_sql_jdbc.vcproj).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/06/using-dbsql-jdbc-driver-in-adfjdeveloper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用DBSQL作为PHP PDO数据库引擎</title>
		<link>http://www.bdbchina.com/2010/04/%e4%bd%bf%e7%94%a8dbsql%e4%bd%9c%e4%b8%baphp-pdo%e6%95%b0%e6%8d%ae%e5%ba%93%e5%bc%95%e6%93%8e/</link>
		<comments>http://www.bdbchina.com/2010/04/%e4%bd%bf%e7%94%a8dbsql%e4%bd%9c%e4%b8%baphp-pdo%e6%95%b0%e6%8d%ae%e5%ba%93%e5%bc%95%e6%93%8e/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 12:58:44 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[DBSQL]]></category>
		<category><![CDATA[PDO]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1239</guid>
		<description><![CDATA[PHP Data Object(PDO)是PHP访问数据库的一个扩展库,也是目前PHP程序访问数据库的标准.PDO定义了一组访问数据库的抽象方法. 不论何种类型的数据库, 我们只用同样的接口访问就可以了.采用PDO接口的PHP程序具有独立性和开放性：与具体的数据库系统无关，与具体的操作系统无关.
本文介绍了如何在Linux环境下应用Berkeley DB SQL(DBSQL)作为PHP PDO数据库引擎.考虑到会有许多SQLite用户迁移到DBSQL以获得更高的并发性和性能,本文创建了一个SQLite3数据库并展示了如何将已有SQLite3数据库迁移到DBSQL上来.

1. 安装PDO SQLite
本文假定您已经有了一个可工作的Apache+PHP 5.x环境.此外,如果你没有一个可工作的PDO SQLite, 那么需要安装一个.以Ubuntu机器为例,我们只需要使用aptitude安装php5-sqlite即可.其它环境请Google/Baidu一下适用的安装步骤.
安装完成后,应该检查一下/usr/lib/php5/20060613+lfs目录下(该目录可能根据环境有所不同,以下一律以本机环境/usr/lib/php5/20060613+lfs为例)是否有pdo.so和pdo_sqlite.so文件:
debian:/usr/lib/php5/20060613+lfs# ls
pdo.so  pdo_sqlite.so

2. 数据库迁移
(是为了模拟SQLite3用户的迁移场景，本步骤准备了一个SQLite3数据库,并将其迁移到DBSQL数据上来)
创建SQLite3数据库/tmp/test.db,将以下文本保存为/tmp/create.sql:
CREATE TABLE Friends
([id] integer,
 [LastName] text,
 [FirstName] text,
 [Phone] text,
 CONSTRAINT [Index1] PRIMARY KEY ([id]));
INSERT INTO Friends (id, LastName, FirstName, Phone)
VALUES (1, 'Zhang', 'San', '1234-0000');
INSERT INTO Friends (id, LastName, FirstName, Phone)
VALUES (2, 'Li', 'Si', '1234-0001');
INSERT INTO Friends (id, LastName, [...]]]></description>
			<content:encoded><![CDATA[<p>PHP Data Object(PDO)是PHP访问数据库的一个扩展库,也是目前PHP程序访问数据库的标准.PDO定义了一组访问数据库的抽象方法. 不论何种类型的数据库, 我们只用同样的接口访问就可以了.采用PDO接口的PHP程序具有独立性和开放性：与具体的数据库系统无关，与具体的操作系统无关.</p>
<p>本文介绍了如何在Linux环境下应用Berkeley DB SQL(DBSQL)作为PHP PDO数据库引擎.考虑到会有许多SQLite用户迁移到DBSQL以获得更高的并发性和性能,本文创建了一个SQLite3数据库并展示了如何将已有SQLite3数据库迁移到DBSQL上来.<br />
<span id="more-1239"></span></p>
<h2>1. 安装PDO SQLite</h2>
<p>本文假定您已经有了一个可工作的Apache+PHP 5.x环境.此外,如果你没有一个可工作的PDO SQLite, 那么需要安装一个.以Ubuntu机器为例,我们只需要使用aptitude安装php5-sqlite即可.其它环境请Google/Baidu一下适用的安装步骤.</p>
<p>安装完成后,应该检查一下/usr/lib/php5/20060613+lfs目录下(该目录可能根据环境有所不同,以下一律以本机环境/usr/lib/php5/20060613+lfs为例)是否有pdo.so和pdo_sqlite.so文件:</p>
<pre class="java:nogutter">debian:/usr/lib/php5/20060613+lfs# ls
pdo.so  pdo_sqlite.so
</pre>
<h2>2. 数据库迁移</h2>
<p>(是为了模拟SQLite3用户的迁移场景，本步骤准备了一个SQLite3数据库,并将其迁移到DBSQL数据上来)<br />
创建SQLite3数据库/tmp/test.db,将以下文本保存为/tmp/create.sql:</p>
<pre class="java:nogutter">CREATE TABLE Friends
([id] integer,
 [LastName] text,
 [FirstName] text,
 [Phone] text,
 CONSTRAINT [Index1] PRIMARY KEY ([id]));
INSERT INTO Friends (id, LastName, FirstName, Phone)
VALUES (1, 'Zhang', 'San', '1234-0000');
INSERT INTO Friends (id, LastName, FirstName, Phone)
VALUES (2, 'Li', 'Si', '1234-0001');
INSERT INTO Friends (id, LastName, FirstName, Phone)
VALUES (3, 'Wang', 'Wu', '1234-0002');
</pre>
<p>使用sqlite3 shell创建一个test.db:</p>
<pre class="java:nogutter">/tmp$ cat create.sql | sqlite3 test.db
</pre>
<p>到现在为止,我们已经模拟了现实场景:我们有一个可工作的PDO(SQLite)和数据库文件.接下来我们将它迁移到DBSQL上来:<br />
<strong>a) </strong>按照http://www.bdbchina.com/2010/04/在unixlinux平台上应用berkeley-db-11gr2-sql/,编译得到库libdb_sql-5.0.so(路径:$HOME/db-5.0.21/build_unix/.libs/libdb_sql-5.0.so)<br />
<strong>b)</strong> 按照以下步骤dump SQLite3数据库到test.dump文件:</p>
<pre class="java:nogutter">/tmp$ sqlite3 test.db
SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite&gt; .output test.dump
sqlite&gt; .dump
sqlite&gt; .quit
</pre>
<p><strong>c)</strong> 使用DBSQL shell加载dump文件.加载完成后在/tmp目录下生成新的test.db及test.db-journal:</p>
<pre class="java:nogutter">/tmp$ mv test.db test.db.bak
/tmp$ $HOME/db-5.0.21/build_unix/dbsql test.db
Berkeley DB 11g Release 2, library version 11.2.5.0.21: (March 30, 2010)
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
dbsql&gt; .read test.dump
dbsql&gt; .quit
/tmp$ ls
create.sql  test.db  test.db-journal  test.dump  test.db.bak
</pre>
<h2>3. 安装PDO DBSQL</h2>
<p>本步骤需要root权限.具体做法如下:<br />
<strong>a)</strong>复制libdb_sql-5.0.so到php lib目录下并改名为libdb_sql-50.so:</p>
<pre class="java:nogutter">    cp /build_unix/.libs/libdb_sql-5.0.so /usr/lib/php5/20060613+lfs/libdb_sql-50.so
</pre>
<p><strong>b)</strong>使用vi编辑usr/lib/php5/20060613+lfs/pdo_sqlite.so(这是一个二进制文件),并将文件中的libsqlite3.so.0替换为libdb_sql-50.so(只有一处替换).这使得pdo_sqlite.so连接到DBSQL,而不是SQLite3.<br />
<strong>c)</strong>把usr/lib/php5/20060613+lfs/增加到HTTP Server的LD_LIBRARY_PATH环境变量中.否则Web Server无法找到libdb_sql-50.so. 不同的HTTP Server的具体做法不同.以Apache2为例,编辑/etc/apache2/envvars,增加一行:</p>
<pre class="java:nogutter">    export LD_LIBRARY_PATH=/usr/lib/php5/20060613+lfs/
</pre>
<p><strong>d)</strong>重启HTTP Server,仍以Apache2为例:</p>
<pre class="java:nogutter">    /etc/init.d/apache2 restart
</pre>
<h2>4. 使用PDO DBSQL</h2>
<p>创建好数据库后,我们用PDO接口来访问它:将以下PHP程序保存到HTTP服务器的根目录(如htdoc/)目录下并命名为pdo_dbsql.php:</p>
<pre class="PHP:Beautifier">&lt;?php
try {
    $db = new PDO("sqlite:/tmp/test.db");

    /*** The SQL SELECT statement ***/
    $sql = "SELECT * FROM Friends";
    $db-&gt;exec($sql);

    /*** Print Query Results ***/
    echo "&lt;table&gt;&lt;tr&gt;&lt;th&gt;ID&lt;/th&gt;&lt;th&gt;Last Name&lt;/th&gt;";
    echo "&lt;th&gt;First Name&lt;/th&gt;&lt;th&gt;Phone&lt;/th&gt;&lt;/tr&gt;";
    foreach ($db-&gt;query($sql) as $row) {
        echo "&lt;tr&gt;";
        echo "&lt;td&gt;".$row["id"]."&lt;/td&gt;";
        echo "&lt;td&gt;".$row["LastName"]."&lt;/td&gt;";
        echo "&lt;td&gt;".$row["FirstName"]."&lt;/td&gt;";
        echo "&lt;td&gt;".$row["Phone"]."&lt;/td&gt;";
        echo "&lt;/tr&gt;";
    }
    echo "&lt;/table&gt;";

    /*** close the database connection ***/
    $db = null;
} catch(PDOException $e) {
    echo $e-&gt;getMessage();
}
?&gt;
</pre>
<p>使用Web浏览器访问我们编写好的pdo_dbsql.php(如http://192.168.1.131/pdo_dbsql.php),即可看到使用PDO的运行结果:<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/04/pdo_dbsql.png"><img class="alignnone size-full wp-image-1246" title="pdo_dbsql" src="http://www.bdbchina.com/wp-content/uploads/2010/04/pdo_dbsql.png" alt="" width="589" height="425" /></a></p>
<h2>5. 结束语</h2>
<p>本文我们介绍了如何将PDO数据引擎从SQLite迁移到DBSQL上来.对于直接采用DBSQL的用户而言,数据迁移一步可直接跳过,直接创建新的DBSQL数据库就好了.DBSQL与SQLite相比具有更高的并发性和性能,是值得PHP开发者尝试的全新SQL数据库引擎.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/%e4%bd%bf%e7%94%a8dbsql%e4%bd%9c%e4%b8%baphp-pdo%e6%95%b0%e6%8d%ae%e5%ba%93%e5%bc%95%e6%93%8e/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>在UNIX/Linux平台上应用Berkeley DB 11gR2 SQL</title>
		<link>http://www.bdbchina.com/2010/04/%e5%9c%a8unixlinux%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sql/</link>
		<comments>http://www.bdbchina.com/2010/04/%e5%9c%a8unixlinux%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sql/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 06:35:08 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=1121</guid>
		<description><![CDATA[最新发布的Berkeley DB 11gR2是第一个支持SQL的版本，编译过程与以往版本稍有不同。本文将介绍如何在Linux/UNIX下编译 Berkeley DB SQL 5.0.21(以下简称DBSQL)，并运行DBSQL范例。

下载安装包
从官方网站下载db-5.0.21.tar.gz并解压缩获得db-5.0.21目录。
配置

cd db-5.0.21/build_unix
../dist/configure --enable-sql --enable-sql_compact

选项说明：

--enable-sql_compact：

使dbsql库(libdb_sql-5.0.so)包含db库(libdb-5.0.so)，这样libdb_sql-5.0.so就不依赖于db库，其中dbsql提供了SQL API，db库包含原有的BDB功能，这样应用程序不需要链接两个库，方便使用。编译得到的库与sqlite 3.6.22版本对应。方便使用。编译得到的库与sqlite 3.6.22版本对应。


其它常用配置选项：

只编译静态库：

加上"--disable-shared"。

编译最小库：

加上"--enable-smallbuild --enable-statistics"。
这里的--enable-statistics是必须搭配--enable-smallbuild使用的。因为默认的smallbuild不包含dbsql所需要的statistics组件。
常规编译获得的DBSQL动态库大小为2.2M，而最小方式编译得到的库大小为1.1M。话说回来，对于UNIX/Linux大多数应用来说，多个1M大小不是问题，而且smallbuild会采用Os编译器优化选项(尺寸优先)取代O3选项(速度优先)，性能会有所下降。


编译

make dbsql

对于动态编译方式，实际库文件在build_unix/.libs目录下，文件：

.libs/libdb_sql-5.0.so (动态库文件)
.libs/dbsql (交互式命令行工具)

而对于静态编译方式，库文件在build_unix/目录下，文件：

libdb_sql-5.0.a (静态库文件)
dbsql (交互式命令行工具)

如果你需要使用各种BDB工具(如db_dump, db_load等)，进一步执行编译指令make，你将能够得到BDB所提供的所有的库文件和工具，包括之前make dbsql得到的库，以及除了上述db_dump, db_load之外的其他所有BDB提供的工具，熟悉BDB的用户一定对此不陌生。
最后，如果你需要清除包括Makefile在内的所有编译文件，可执行make distclean。Makefile是由configure生成的，单纯的&#8221;make clean&#8221;不能清除这部分记录。
编译并运行范例
DBSQL的C API完全沿用SQLite的C API，这里是SQLite3 C API列表。sql/examples/目录下有多个参考范例。以下我们以C语言范例sql/examples/c/ex_sql_index.c为例：

make ex_sql_index
./ex_sql_index

程序做了以下几件事情：

1. 把表格university加载到数据库
2. 打印以下SQL语句的Query Plan。我们可以看到Query Plan中的VDBE指令有32条。并且有两条向前跳转的Next指令，表示出现了两次循环迭代。

        SELECT rank, country, name
        from university
   [...]]]></description>
			<content:encoded><![CDATA[<p>最新发布的Berkeley DB 11gR2是第一个支持SQL的版本，编译过程与以往版本稍有不同。本文将介绍如何在Linux/UNIX下编译 Berkeley DB SQL 5.0.21(以下简称DBSQL)，并运行DBSQL范例。<br />
<span id="more-1121"></span></p>
<h2>下载安装包</h2>
<p>从<a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html">官方网站</a>下载db-5.0.21.tar.gz并解压缩获得db-5.0.21目录。</p>
<h2>配置</h2>
<pre name="code" class="java:nogutter">
cd db-5.0.21/build_unix
../dist/configure --enable-sql --enable-sql_compact
</pre>
<p><strong>选项说明：</strong></p>
<ul>
<li><tt>--enable-sql_compact：</tt>
<ul>
<li><tt>使dbsql库(libdb_sql-5.0.so)包含db库(libdb-5.0.so)，这样libdb_sql-5.0.so就不依赖于db库，其中dbsql提供了SQL API，db库包含原有的BDB功能，这样应用程序不需要链接两个库，方便使用。编译得到的库与sqlite 3.6.22版本对应。方便使用。编译得到的库与sqlite 3.6.22版本对应。</tt></li>
</ul>
</ul>
<p><strong>其它常用配置选项：</strong></p>
<ul>
<li><tt>只编译静态库：</tt>
<ul>
<li><tt>加上"--disable-shared"。</tt></li>
</ul>
<li><tt>编译最小库：</tt>
<ul>
<li><tt>加上"--enable-smallbuild --enable-statistics"。</tt></li>
<li><tt>这里的--enable-statistics是必须搭配--enable-smallbuild使用的。因为默认的smallbuild不包含dbsql所需要的statistics组件。</tt></li>
<li><tt>常规编译获得的DBSQL动态库大小为2.2M，而最小方式编译得到的库大小为1.1M。话说回来，对于UNIX/Linux大多数应用来说，多个1M大小不是问题，而且smallbuild会采用Os编译器优化选项(尺寸优先)取代O3选项(速度优先)，性能会有所下降。</tt></li>
</ul>
</ul>
<h2>编译</h2>
<pre name="code" class="java:nogutter">
make dbsql
</pre>
<p>对于动态编译方式，实际库文件在build_unix/.libs目录下，文件：</p>
<pre name="code" class="java:nogutter">
.libs/libdb_sql-5.0.so (动态库文件)
.libs/dbsql (交互式命令行工具)
</pre>
<p>而对于静态编译方式，库文件在build_unix/目录下，文件：</p>
<pre name="code" class="java:nogutter">
libdb_sql-5.0.a (静态库文件)
dbsql (交互式命令行工具)
</pre>
<p>如果你需要使用各种BDB工具(如db_dump, db_load等)，进一步执行编译指令make，你将能够得到BDB所提供的所有的库文件和工具，包括之前make dbsql得到的库，以及除了上述db_dump, db_load之外的其他所有BDB提供的工具，熟悉BDB的用户一定对此不陌生。</p>
<p>最后，如果你需要清除包括Makefile在内的所有编译文件，可执行make distclean。Makefile是由configure生成的，单纯的&#8221;make clean&#8221;不能清除这部分记录。</p>
<h2>编译并运行范例</h2>
<p>DBSQL的C API完全沿用SQLite的C API，<a href='http://www.sqlite.org/c3ref/funclist.html'>这里</a>是SQLite3 C API列表。sql/examples/目录下有多个参考范例。以下我们以C语言范例sql/examples/c/ex_sql_index.c为例：</p>
<pre name="code" class="java:nogutter">
make ex_sql_index
./ex_sql_index
</pre>
<p>程序做了以下几件事情：</p>
<ul>
<li>1. 把表格university加载到数据库</li>
<li>2. 打印以下SQL语句的Query Plan。我们可以看到Query Plan中的VDBE指令有32条。并且有两条向前跳转的Next指令，表示出现了两次循环迭代。
<pre name="code" class="java:nogutter">
        SELECT rank, country, name
        from university
        WHERE region = 'Europe'
        ORDER BY country;
</pre>
</li>
<li>3. 增加关于region, country的索引
<li>4. 再次打印Query Plan。我们可以看到Query Plan中的VDBE指令简化到了21条。并且只有一次向前跳转的Next指令，表示只(在索引上)出现了一次循环迭代。</li>
<li>5. 删除关于region, country的索引</li>
</ul>
<p>以下是程序输出：</p>
<pre name="code" class="java:nogutter">
================================================================================
Load data source ../sql/examples/data/university.csv into database.
Load done.
================================================================================
STEP1. Explain a query expression
SQL:    EXPLAIN
        SELECT rank, country, name
        from university
        WHERE region = 'Europe'
        ORDER BY country;
  0     Trace   0       0       0               00      (null)
  1     OpenEphemeral   1       3       0       keyinfo(1,BINARY)       00      (null)
  2     String8 0       1       0       Europe  00      (null)
  3     Goto    0       29      0               00      (null)
  4     OpenRead        0       3       0       5       00      (null)
  5     Rewind  0       18      0               00      (null)
  6     Column  0       4       2               00      (null)
  7     Ne      1       17      2       collseq(BINARY) 69      (null)
  8     Column  0       0       4               00      (null)
  9     Column  0       3       5               00      (null)
  10    Column  0       1       6               00      (null)
  11    MakeRecord      4       3       2               00      (null)
  12    Column  0       3       7               00      (null)
  13    Sequence        1       8       0               00      (null)
  14    Move    2       9       1               00      (null)
  15    MakeRecord      7       3       3               00      (null)
  16    IdxInsert       1       3       0               00      (null)
  17    Next    0       6       0               01      (null)
  18    Close   0       0       0               00      (null)
  19    OpenPseudo      2       2       3               00      (null)
  20    Sort    1       27      0               00      (null)
  21    Column  1       2       2               00      (null)
  22    Column  2       0       4               20      (null)
  23    Column  2       1       5               00      (null)
  24    Column  2       2       6               00      (null)
  25    ResultRow       4       3       0               00      (null)
  26    Next    1       21      0               00      (null)
  27    Close   2       0       0               00      (null)
  28    Halt    0       0       0               00      (null)
  29    Transaction     0       0       0               00      (null)
  30    VerifyCookie    0       5       0               00      (null)
  31    TableLock       0       3       0       university      00      (null)
  32    Goto    0       4       0               00      (null)
================================================================================
STEP2. Create an index on university(region, country)
SQL:    CREATE INDEX university_geo
        ON university (region, country);
================================================================================
STEP3. Explain the query again, we can see the difference
SQL:    EXPLAIN
        SELECT rank, country, name
        from university
        WHERE region = 'Europe'
        ORDER BY country;
  0     Trace   0       0       0               00      (null)
  1     Noop    0       0       0               00      (null)
  2     String8 0       1       0       Europe  00      (null)
  3     Goto    0       18      0               00      (null)
  4     OpenRead        0       3       0       5       00      (null)
  5     OpenRead        2       4       0       keyinfo(2,BINARY,BINARY)        00      (null)
  6     SeekGe  2       15      1       1       00      (null)
  7     IdxGE   2       15      1       1       01      (null)
  8     IdxRowid        2       2       0               00      (null)
  9     Seek    0       2       0               00      (null)
  10    Column  0       0       3               00      (null)
  11    Column  2       1       4               00      (null)
  12    Column  0       1       5               00      (null)
  13    ResultRow       3       3       0               00      (null)
  14    Next    2       7       0               00      (null)
  15    Close   0       0       0               00      (null)
  16    Close   2       0       0               00      (null)
  17    Halt    0       0       0               00      (null)
  18    Transaction     0       0       0               00      (null)
  19    VerifyCookie    0       6       0               00      (null)
  20    TableLock       0       3       0       university      00      (null)
  21    Goto    0       4       0               00      (null)
================================================================================
STEP4. Drop the index
SQL: DROP INDEX university_geo;
DONE.
</pre>
<h2>使用dbsql shell</h2>
<p>范例运行完后，我们还可以用dbsql shell来查看/操作生成的数据库文件：</p>
<pre name="code" class="java:nogutter">
build_unix$ ./dbsql ex_sql_index.db
Berkeley DB 11g Release 2, library version 11.2.5.0.21: (March 30, 2010)
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
dbsql> .tables
university
dbsql> select * from university;
1|Massachusetts Institute of Technology|mit.edu|us|North America|2|1|1|7
2|Harvard University|harvard.edu|us|North America|7|2|12|1
3|Stanford University|stanford.edu|us|North America|4|4|2|24
4|University of California Berkeley|berkeley.edu|us|North America|8|3|5|32
5|Cornell University|cornell.edu|us|North America|1|5|9|37
6|University of Wisconsin Madison|wisc.edu|us|North America|3|10|6|71
7|University of Minnesota|umn.edu|us|North America|6|15|7|22
8|California Institute of Technology|caltech.edu|us|North America|18|6|20|30
9|University of Illinois Urbana Champaign|uiuc.edu|us|North America|17|7|13|51
10|University of Michigan|umich.edu|us|North America|10|8|18|55
11|University of Texas Austin|utexas.edu|us|North America|12|11|8|44
12|University of Washington|washington.edu|us|North America|22|9|4|94
13|University of Chicago|uchicago.edu|us|North America|42|16|44|2
14|Carnegie Mellon University|cmu.edu|us|North America|5|24|3|93
15|University of Pennsylvania|upenn.edu|us|North America|16|14|33|26
16|Columbia University New York|columbia.edu|us|North America|19|12|21|95
17|Texas A&#038;M University|tamu.edu|us|North America|31|31|11|17
18|University of Maryland|umd.edu|us|North America|37|22|17|52
19|University of California Los Angeles|ucla.edu|us|North America|13|17|26|110
20|Purdue University|purdue.edu|us|North America|14|34|14|46
21|Johns Hopkins University|jhu.edu|us|North America|59|27|49|3
22|University of Cambridge|cam.ac.uk|uk|Europe|26|13|70|86
23|Pennsylvania State University|psu.edu|us|North America|27|29|16|102
24|University of Tokyo|u-tokyo.ac.jp|jp|Asia|32|26|65|31
25|University of Arizona|arizona.edu|us|North America|20|36|19|134
dbsql> .quit
</pre>
<h2>结束语</h2>
<p>以上我们介绍了如何在UNIX/Linux环境下编译DBSQL并运行范例。在这一版本开发中，我们为新增SQL部分增加了十个范例，可作为快速参考:</p>
<pre name="code" class="java:nogutter">
1.ex_sql_load:          create table, insert, load csv files
2.ex_sql_query:         select, order by, group by, subquery, SQL function
3.ex_sql_index:         index, query explain
4.ex_sql_statment:      prepare, iterate results, callback function
5.ex_sql_transaction:   transaction, commit, rollback
6.ex_sql_savepoint:     savepoint
7.ex_sql_multi_thread:  multi-thread, transaction, lock/busy handle
8.ex_sql_binding:       prepare, variable binding, transaction, bulk insert
9.ex_sql_fts3:          full-text search features
10.ex_sql_rtree:        create, maintain, and query r-tree index
</pre>
<p>如果您有什么问题和建议，欢迎与我联系。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/%e5%9c%a8unixlinux%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sql/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>在Android平台上应用Berkeley DB 11gR2 SQL(drop-in模式)</title>
		<link>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqldrop-in%e6%a8%a1%e5%bc%8f/</link>
		<comments>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqldrop-in%e6%a8%a1%e5%bc%8f/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 11:28:50 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=980</guid>
		<description><![CDATA[前文我们介绍了如何编译Berkeley DB SQL(DBSQL)库并放到Android平台上使用。现在我们来介绍另一种更为彻底的使用方式。依本方法编译得到的BDB库将完全替换Android的SQLite库，我们称其为drop-in模式。在这种模式下，Android平台上所有的应用程序(包括我们自己编译的应用程序)都将链接到DBSQL库以获取更高的存储和并发性能。
本文将展示如何在Ubuntu Linux x32平台上使用完整的Android源代码来编译构建我们的全新Android系统镜像，而Android源代码包中包含了交叉编译器，因此我们不需要事先安装NDK。

1. 编译Android代码
从Android官方网站获取一份Android源代码，这份源代码有2~3G之巨。
在Linux平台上，把源代码解压到$HOME/android/android_src
安装java 1.5版本，(1.6不行)，并设置JAVA_HOME和PATH:

$ export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
$ export PATH=$JAVA_HOME/bin:$PATH

先把原始的Android代码完全编译成功(这过程可能要花2~3小时)：

$ cd $HOME/android/android_src
$ . build/envsetup.sh
$ make

可看到生成三个镜像：

Install system fs image: out/target/product/generic/system.img
Target ram disk: out/target/product/generic/ramdisk.img
Target userdata fs image: out/target/product/generic/userdata.img

2. 安装Android SDK并测试镜像
安装Android SDK: http://developer.android.com/sdk/installing.html, 安装目录：$HOME/android/android-sdk-linux_86
安装Android SDK组件: http://developer.android.com/sdk/adding-components.html,选择安装SDK Platform Android 2.1 API 7和Google APIs by Google Inc., Android API 7
用我们编译得到的镜像替换系统的默认镜像。如果需要替换Windows环境下的sdk，那么以下目录&#8221;android-sdk-linux_86&#8243;相应应该改成 &#8220;android-sdk-windows&#8221;。

$ cd $HOME/android/android-sdk-linux_86/platforms/android-2.1
$ cp -r images images.bak
$ cp $HOME/android/android_src/out/target/product/generic/*.img [...]]]></description>
			<content:encoded><![CDATA[<p>前文我们介绍了如何编译Berkeley DB SQL(DBSQL)库并放到Android平台上使用。现在我们来介绍另一种更为彻底的使用方式。依本方法编译得到的BDB库将完全替换Android的SQLite库，我们称其为drop-in模式。在这种模式下，Android平台上所有的应用程序(包括我们自己编译的应用程序)都将链接到DBSQL库以获取更高的存储和并发性能。</p>
<p>本文将展示如何在Ubuntu Linux x32平台上使用完整的Android源代码来编译构建我们的全新Android系统镜像，而Android源代码包中包含了交叉编译器，因此我们不需要事先安装NDK。</p>
<p><span id="more-980"></span></p>
<h2>1. 编译Android代码</h2>
<p>从<a href="http://source.android.com/download">Android官方网站</a>获取一份Android源代码，这份源代码有2~3G之巨。</p>
<p>在Linux平台上，把源代码解压到$HOME/android/android_src</p>
<p>安装java 1.5版本，(1.6不行)，并设置JAVA_HOME和PATH:</p>
<pre name="code" class="java:nogutter">
$ export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
$ export PATH=$JAVA_HOME/bin:$PATH
</pre>
<p>先把原始的Android代码完全编译成功(这过程可能要花2~3小时)：</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android_src
$ . build/envsetup.sh
$ make
</pre>
<p>可看到生成三个镜像：</p>
<pre name="code" class="java:nogutter">
Install system fs image: out/target/product/generic/system.img
Target ram disk: out/target/product/generic/ramdisk.img
Target userdata fs image: out/target/product/generic/userdata.img
</pre>
<h2>2. 安装Android SDK并测试镜像</h2>
<p>安装Android SDK: <a href="http://developer.android.com/sdk/installing.html">http://developer.android.com/sdk/installing.html</a>, 安装目录：$HOME/android/android-sdk-linux_86<br />
安装Android SDK组件: <a href="http://developer.android.com/sdk/adding-components.html">http://developer.android.com/sdk/adding-components.html</a>,选择安装SDK Platform Android 2.1 API 7和Google APIs by Google Inc., Android API 7</p>
<p>用我们编译得到的镜像替换系统的默认镜像。如果需要替换Windows环境下的sdk，那么以下目录&#8221;android-sdk-linux_86&#8243;相应应该改成 &#8220;android-sdk-windows&#8221;。</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android-sdk-linux_86/platforms/android-2.1
$ cp -r images images.bak
$ cp $HOME/android/android_src/out/target/product/generic/*.img images
</pre>
<p>创建并运行一个新的设备:</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android-sdk-linux_86/tools/
$ ./android
</pre>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_3-e1269938549584.png"><img src="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_3-e1269938549584.png" alt="" title="bdb_drop_in_3" width="498" height="287" class="alignnone size-full wp-image-995" /></a></p>
<p>(如图)使用图形界面工具创建一个Android 2.1的设备BDBSQL,并点击&#8221;start&#8221;启动。新的设备第一次启动的时间会非常长，这是正常现象。等到Android界面出现，就说明我们的镜像编译基本没问题了。接下来我们进一步把SQLite库替换为BDB。</p>
<h2>3. 编译DBSQL</h2>
<p>从<a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html">http://www.oracle.com/technology/software/products/berkeley-db/index.html</a>下载BDB 11gR2源文件(db-5.0.x.tar.gz)，然后</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android_src/external/sqlite/dist
$ tar zxvf db-5.0.x.tar.gz
$ cp Android.mk Android.mk.bak
$ cp db-5.0.x/build_android/Android.mk .
</pre>
<p>编辑Android.mk，默认的BDB Log和Region文件大小总和可达到十几兆，因此我们有必要修改Android.mk来减小它(可能需要为Android.mk去掉只读属性)。修改第一处LOCAL_CFLAGS如下所示(相对于默认配置，我们删除了-DSQLITE_OMIT_TRUNCATE_OPTIMIZATION，新增了-DSQLITE_DEFAULT_CACHE_SIZE=256 -DBDBSQL_MAX_LOCKS=1000 -DBDBSQL_MAX_LOCK_OBJECTS=1000)：</p>
<pre name="code" class="java:nogutter">
LOCAL_CFLAGS += -Wall -DHAVE_USLEEP=1 \
        -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 \
        -DSQLITE_THREADSAFE=1 -DNDEBUG=1 -DSQLITE_TEMP_STORE=3 \
        -DSQLITE_OS_UNIX=1 \
        -D_HAVE_SQLITE_CONFIG_H -DSQLITE_THREAD_OVERRIDE_LOCK=-1 \
        -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_BACKWARDS -Dfdatasync=fsync \
        -DSQLITE_DEFAULT_CACHE_SIZE=256 \
        -DBDBSQL_MAX_LOCKS=1000 \
        -DBDBSQL_MAX_LOCK_OBJECTS=1000
</pre>
<p>如果确定不会在多进程间共享数据库，还可以在上述LOCAL_CFLAGS中加入&#8221;-DBDBSQL_OMIT_SHARING&#8221;，这样日志文件不会被写入文件系统，进一步节省了设备空间。</p>
<p>编译系统镜像中的SQLite部分:</p>
<pre name="code" class="java:nogutter">
$ cd $HOME/android/android_src
$ . build/envsetup.sh
$ make clean-libsqlite
$ mmm -B external/sqlite/dist
$ make snod
</pre>
<p>编译好了，再来一次镜像替换：</p>
<pre name="code" class="java:nogutter">
$ cp $HOME/android/android_src/out/target/product/generic/*.img $HOME/android/android-sdk-linux_86/platforms/android-2.1/images
</pre>
<p>使用图形界面工具删除先前的设备BDBSQL，重创建一个新的Android 2.1设备BDBSQL,并点击&#8221;start&#8221;启动。这里一定要创建新的设备，因为启动过的设备，其数据库文件已被SQLite生成，DBSQL无法访问。</p>
<h2>4. 使用DBSQL</h2>
<p>现在Android里所有应用程序的SQL存储引擎都已被替换为DBSQL了。我们使用&#8221;联系人&#8221;来试用一下我们的新设备吧，在Setting里面把Locate设置为中文简体，安装一个中文输入法(比如搜狗)，然后打开“联系人”，随便增加一条记录：<br />
<a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_5.jpg"><img src="http://www.bdbchina.com/wp-content/uploads/2010/03/bdb_drop_in_5.jpg" alt="" title="bdb_drop_in_5" width="600" height="421" class="alignnone size-full wp-image-1001" /></a></p>
<p>在主机上我们可以使用adb shell来查看并操作程序所生成的数据库。请留意sqlite3 shell输出的版本信息是Berkeley DB 11gR，同时shell的提示符是dbsql>，这说明我们已经把SQLite成功替换为DBSQL引擎：</p>
<pre name="code" class="java:nogutter">
$ adb shell
# cd /data/data/com.android.providers.contacts/databases/
# sqlite3 contacts2.db
Berkeley DB 11g Release 2, library version 11.2.5.0.21: (March 30, 2010)
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
dbsql> .tables
_sync_state                       status_updates
_sync_state_metadata              v1_settings
activities                        view_contacts
agg_exceptions                    view_contacts_restricted
android_metadata                  view_data
calls                             view_data_restricted
contact_entities_view             view_groups
contact_entities_view_restricted  view_raw_contacts
contacts                          view_raw_contacts_restricted
data                              view_v1_contact_methods
groups                            view_v1_extensions
mimetypes                         view_v1_group_membership
name_lookup                       view_v1_groups
nickname_lookup                   view_v1_organizations
packages                          view_v1_people
phone_lookup                      view_v1_phones
raw_contacts                      view_v1_photos
settings
dbsql> select * from contacts;
2|逍遥 李|||0|0|0|0|1|1|0nE08B4A8BFA37D4||0
dbsql> select * from data;
1||4|1|0|0|0|li|li|||||||||||||||||
2||6|2|0|0|0|66666666|1||66666666|||||||||||||||
3||6|2|0|0|0|88888888|2||88888888|||||||||||||||
4||8|2|0|0|0|蜀山|1|||||||||||||||||
5||4|2|0|0|0|逍遥 李|逍遥|李||||||||||||||||
dbsql>
</pre>
<h2>5. 结束语</h2>
<p>关于DBSQL库在Android平台上的编译和使用的介绍到这里就结束了。我们用两篇博文分别介绍了side-by-side(并存)和Drop-in(替换)这两种使用方式。在Drop-in模式下，现有的应用程序无修改就可以直接使用DBSQL引擎。</p>
<p>DBSQL在开发过程中始终给予Android平台高度重视，在开发过程中投入了多位资深工程师致力于将DBSQL移植到Android平台上，并将Android列为产品周期测试的主流平台。OARDC的工程师Zengfa.Dou和Stephen.Tang给予了我这个初学者极大帮助。在此一并致谢！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqldrop-in%e6%a8%a1%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Android平台上应用Berkeley DB 11gR2 SQL(side-by-side模式)</title>
		<link>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqlside-by-side%e6%a8%a1%e5%bc%8f/</link>
		<comments>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqlside-by-side%e6%a8%a1%e5%bc%8f/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 11:28:14 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[bdb]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=946</guid>
		<description><![CDATA[Berkeley DB(BDB)从新发布的版本11gR2开始支持SQL。BDB在性能上的优势详见博文&#8221;Oracle Berkeley DB 支持SQL啦&#8221;以及更多关于Oracle Berkeley DB SQL的报道。本文将介绍如何在Android上开发平台上编译并运行BDB 11gR2 SQL库(以下简称DBSQL)。
本文介绍在Linux平台上如何编译得到适用于Android的DBSQL库，依本文方法编译得到的BDB库将和Android自带的SQLite库并存，我们称其为side-by-side(并存)模式。在这种模式下，Android平台上已有的应用程序还是基于原始的SQLite库，而我们自己编译的应用程序则链接到DBSQL库以获取更高的存储和并发性能。

1. 安装开发环境
(本文假定读者已具备初步的Android Emulator使用经验)
安装SDK
从http://developer.android.com/sdk/index.html下载Android SDK并解压缩得到$HOME/android/android-sdk-linux_86/目录。
安装NDK
从http://developer.android.com/intl/zh-TW/sdk/ndk/index.html下载Linux版Android NDK(android-ndk-r3-linux-x86.zip)并解压缩得到$HOME/android/android-ndk-1.6_r3/目录。

$ cd android-ndk-1.6_r3
$ build/host-setup.sh

安装NDK Wapper
从开心网共享文件夹下载ndk-wrappers.tgz到$HOME/android

$ tar zxvf ndk-wrappers.tgz

ndk-wrapper需要以下变量，因此我们需要把以下变量增加到$HOME/.bashrc并使之生效：
export PATH=$HOME/android/ndk-wrappers/bin:$PATH
$ export NDK_DIR=$HOME/android/android-ndk-1.6_r3
$ export PATH=$HOME/android/android-sdk-linux_86/tools:$PATH
$ . $HOME/.bashrc

(NDK-Wrapper默认使用arm-eabi-gcc 4.2.1, 如果你想使用ndk里面的arm-eabi-gcc 4.4.0，把scripts/env-utils.sh 和setup.sh里面的4.2.1改为4.4.0)
开始安装ndk-wrapper：

$ cd ndk-wrappers
$ ./setup.sh

修改Ndk-Wrapper
修改ndk-wrappers/bin/arm-linux-gcc:

1. 在LINK_FLAGS中增加"-ldl"
2. 删除-fvisibility=hidden

试验Ndk-Wrapper是否可工作
$ arm-linux-gcc --version
arm-eabi-gcc (GCC) 4.4.0
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying [...]]]></description>
			<content:encoded><![CDATA[<p>Berkeley DB(BDB)从新发布的版本11gR2开始支持SQL。BDB在性能上的优势详见<a href="http://www.bdbchina.com/2010/03/oracle-berkeley-db-%E6%94%AF%E6%8C%81sql%E5%95%A6%EF%BC%81/">博文&#8221;Oracle Berkeley DB 支持SQL啦&#8221;</a>以及<a href="http://www.bdbchina.com/2010/03/%E6%9B%B4%E5%A4%9A%E5%85%B3%E4%BA%8Eoracle-berkeley-db-sql%E7%9A%84%E6%8A%A5%E9%81%93/">更多关于Oracle Berkeley DB SQL的报道</a>。本文将介绍如何在Android上开发平台上编译并运行BDB 11gR2 SQL库(以下简称DBSQL)。</p>
<p>本文介绍在Linux平台上如何编译得到适用于Android的DBSQL库，依本文方法编译得到的BDB库将和Android自带的SQLite库并存，我们称其为side-by-side(并存)模式。在这种模式下，Android平台上已有的应用程序还是基于原始的SQLite库，而我们自己编译的应用程序则链接到DBSQL库以获取更高的存储和并发性能。</p>
<p><span id="more-946"></span></p>
<h2>1. 安装开发环境</h2>
<p>(本文假定读者已具备初步的Android Emulator使用经验)<br />
<strong>安装SDK</strong><br />
从<a href="http://developer.android.com/sdk/index.html">http://developer.android.com/sdk/index.html</a>下载Android SDK并解压缩得到$HOME/android/android-sdk-linux_86/目录。</p>
<p><strong>安装NDK</strong><br />
从<a href="http://developer.android.com/intl/zh-TW/sdk/ndk/index.html">http://developer.android.com/intl/zh-TW/sdk/ndk/index.html</a>下载Linux版Android NDK(android-ndk-r3-linux-x86.zip)并解压缩得到$HOME/android/android-ndk-1.6_r3/目录。</p>
<pre class="java:nogutter">
$ cd android-ndk-1.6_r3
$ build/host-setup.sh
</pre>
<p><strong>安装NDK Wapper</strong><br />
从开心网<a "http://www.kaixin001.com/group/file.php?gid=627784&#038;fid=557046&#038;start=0">共享文件夹</a>下载ndk-wrappers.tgz到$HOME/android</p>
<pre class="java:nogutter">
$ tar zxvf ndk-wrappers.tgz
</pre>
<p>ndk-wrapper需要以下变量，因此我们需要把以下变量增加到$HOME/.bashrc并使之生效：</p>
<pre class="java:nogutter">export PATH=$HOME/android/ndk-wrappers/bin:$PATH
$ export NDK_DIR=$HOME/android/android-ndk-1.6_r3
$ export PATH=$HOME/android/android-sdk-linux_86/tools:$PATH
$ . $HOME/.bashrc
</pre>
<p>(NDK-Wrapper默认使用arm-eabi-gcc 4.2.1, 如果你想使用ndk里面的arm-eabi-gcc 4.4.0，把scripts/env-utils.sh 和setup.sh里面的4.2.1改为4.4.0)</p>
<p>开始安装ndk-wrapper：</p>
<pre class="java:nogutter">
$ cd ndk-wrappers
$ ./setup.sh
</pre>
<p><strong>修改Ndk-Wrapper</strong><br />
修改ndk-wrappers/bin/arm-linux-gcc:</p>
<pre class="java">
1. 在LINK_FLAGS中增加"-ldl"
2. 删除-fvisibility=hidden
</pre>
<p><strong>试验Ndk-Wrapper是否可工作</strong></p>
<pre class="java:nogutter">$ arm-linux-gcc --version
arm-eabi-gcc (GCC) 4.4.0
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
</pre>
<h2>2. 编译DBSQL</h2>
<p>以下我们使用上面搭建的NDK编译环境来编译适用于Android平台上的DBSQL库。首先从<a href="http://www.oracle.com/technology/software/products/berkeley-db/index.html">Oracle官网</a>上下载Berkeley DB 11gR2(.tar.gz), 解压并改名为db/</p>
<p><strong>设置CFLAGS</strong></p>
<pre class="java:nogutter">
$ export CFLAGS="-DHAVE_USLEEP=1 -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 \
-DNDEBUG=1 -DSQLITE_TEMP_STORE=3 -DSQLITE_OS_UNIX=1 -D_HAVE_SQLITE_CONFIG_H \
-DSQLITE_THREAD_OVERRIDE_LOCK=-1 -Dfdatasync=fsync -DNO_ANDROID_FUNCS \
-DSQLITE_THREADSAFE=1"
</pre>
<p><strong>设置为动态编译方式</strong></p>
<pre class="java:nogutter">
$ cd db/build_unix
$ ../dist/configure --prefix=$HOME/android/install_db_arm --target=arm-linux \
--host=arm-linux --enable-smallbuild --enable-sql --enable-sql_compat \
--enable-statistics --enable-amalgamation
</pre>
<p><strong>修改build_unix/db_config.h</strong><br />
每次configure完成后，切记都要编辑build_unix/db_config.h，删除以下两行：</p>
<pre class="java:nogutter">#define HAVE_PREAD 1
#define HAVE_PWRITE 1
</pre>
<p><strong>开始编译</strong></p>
<pre class="java:nogutter">
$ make dbsql
</pre>
<p>生成的动态库文件为.libs/libdb_sql-5.0.so，Shell文件为.libs/dbsql。</p>
<h2>3. 使用DBSQL库</h2>
<p>我们使用现成的DBSQL范例来演示如何在自己的程序中使用DBSQL库</p>
<p><strong>编译范例</strong></p>
<pre class="java:nogutter">
$ cd  build_unix
$ make ex_sql_query
</pre>
<p>编译完成后生成范例程序.libs/ex_sql_query /data/bdb</p>
<p><strong>运行范例</strong><br />
启动Android Emulator，上传，并运行DBSQL库和范例</p>
<pre class="java:nogutter">
$ adb shell mkdir /data/bdb
$ adb shell mkdir /data/sql/examples/data
$ adb shell mkdir /data/sql
$ adb shell mkdir /data/sql/examples
$ adb shell mkdir /data/sql/examples/data
$ adb push .libs/libdb_sql-5.0.so /data/bdb
$ adb push .libs/ex_sql_query /data/bdb
$ adb push ../sql/examples/data/ /data/sql/examples/data
$ adb shell "cd /data/bdb; export LD_LIBRARY_PATH=/data/bdb; ./ex_sql_query"
</pre>
<p>现在终端应该已经输出query范例的运行结果了。以下是GUI终端的输出截图：</p>
<p><a href="http://www.bdbchina.com/wp-content/uploads/2010/03/bdbsql_android_sidebyside.jpg"><img class="alignnone size-full wp-image-975" title="bdbsql_android_sidebyside" src="http://www.bdbchina.com/wp-content/uploads/2010/03/bdbsql_android_sidebyside.jpg" alt="" width="480" height="332" /></a></p>
<h2>4. 结束语</h2>
<p>至此，关于BDB 11gR2 SQL库的side-by-side编译模式的介绍就结束了。我们可将编译得到的库应用到自己的程序中去。side-by-side模式的优点不改动Android系统底层库和镜像，使用简单。缺点是只能用C/JNI方式调用，无法用Android自带的SQL接口直接调用。而与此对应的是Drop-in模式，Drop-in模式可将Android系统的SQLite层整个替换为BDB 11gR2 SQL，应用程序无修改就可以直接使用，是一种更为强大彻底的应用模式。我们将在后续文章中介绍Drop-in模式的编译方式。</p>
<input id="gwProxy" type="hidden" />
<input id="jsProxy" onclick="jsCall();" type="hidden" />
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2010/04/%e5%9c%a8android%e5%b9%b3%e5%8f%b0%e4%b8%8a%e5%ba%94%e7%94%a8berkeley-db-11gr2-sqlside-by-side%e6%a8%a1%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>采用Berkeley DB XML PHP建立原生XML Web服务器</title>
		<link>http://www.bdbchina.com/2009/10/%e9%87%87%e7%94%a8berkeley-db-xml-php%e5%bb%ba%e7%ab%8b%e5%8e%9f%e7%94%9fxml-web%e6%9c%8d%e5%8a%a1%e5%99%a8/</link>
		<comments>http://www.bdbchina.com/2009/10/%e9%87%87%e7%94%a8berkeley-db-xml-php%e5%bb%ba%e7%ab%8b%e5%8e%9f%e7%94%9fxml-web%e6%9c%8d%e5%8a%a1%e5%99%a8/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 05:58:39 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=618</guid>
		<description><![CDATA[近十年来，XML应用越发广泛，政府也推出了《基于XML的电子公文格式规范》等标准。那么，在需要XML数据库引擎的情况下，采用原生XML数据库Berkeley DB XML(以下简称BDB XML)取代MySQL(或其它传统DB)做后台数据库是一个更好的选择。
BDB XML是Oracle推出的一款开源原生XML数据库。与传统数据库相比，原生XML数据库的优势有：
1. 可以直接操作XML文件，XML数据无损&#8211;在某些场合，无损的数据源意味着法律效力。
2. 原生检索方式，支持XQuery和XPath，符合XML习惯。
3. 性能优化：原生XML数据库会针对XML特点进行各种优化，如插入文档索引、建立节点ID等。
4. 支持相同数据的不同视图。
和其它原生XML数据库相比，BDB XML优势有：
1. 完整的ACID 事务处理、自动恢复、热备份、用于分布式事务的HA支持。
2. 支持XQuery(含XQuery Update)和XPATH。
3. 可以利用其特有的二进制元数据存取大容量二进制对象(非XML数据)。
4. 支持全Unicode字符集，中文存储、查询都不成问题。
5. 提供一套容器和迭代器接口访问和操作查询结果。
6. 提供交互式命令行工具。

以上第三点是一个非常实用的特性，某种程度上它补足了XML应用的”最后一公里“：比方说，你正在为教育部门开发一个考生管理数据库，需要将考生的资料存成XML文档，那么存取照片(二进制数据)就相当麻烦。一般来讲传统的选择有两种：一是转换为Base64Binary格式嵌入到XML文档中，这意味着存取两端都需要转换大量图片数据，效率就很低下;二是为每个照片生成一个引用再另存它处，只在XML文档中保留一个引用，这种方法不但复杂，而且把数据从文档中分割了出来，损失了ACID特性，管理不便。而使用BDB XML就可以将照片数据直接以二进制元数据的形式嵌入到XML文档中，存取都非常方便，还可以基于数据库实现图像/视频检索。
下面，介绍一下BDB XML PHP的安装过程：
安装Apache+PHP环境
好吧，这是一个烂大街的话题，网上一抓一大把。下面以Debian 5.0和apache2为例：
用aptitude安装以下软件包：

apache2
libapache2-mod-php5
php5
php5-dev
php5-cgi
安装完毕。启动Apache服务器：
sudo /etc/init.d/apache2 start
测试一下是否安装成功，首先找到http的根目录(本机环境是/var/www)，在该目录下生成php测试文件test.php(内容如下)：
&#60;?phpinfo();?&#62;
用浏览器打开网页服务器的test.php，如果安装成功，会打开php信息页。
安装BDB XML PHP
移步http://www.oracle.com/technology/software/products/berkeley-db/xml/index.html下载源码包dbxml-2.5.13.tar.gz，并放置在$HOME目录下。下面以Linux上的安装为例：

cd $HOME
tar zxf dbxml-2.5.13.tar.gz
cd dbxml-2.5.13
./buildall
cd db-4.8.24/php_db4
phpize
./configure --with-db4=$PWD/../../install
make
sudo make install
cd ../../dbxml/src/php/
phpize
./configure --with-dbxml=$PWD/../../../install
make
sudo make install

接下来编辑/etc/php5/apache2/php.ini和/etc/php5/cgi/php.ini文件(可能路径略有不同)，把以下两行加到Dynamic Extensions段：
extension=db4.so
extension=dbxml.so
大功告成，为保安全，最好重启一下Apache服务器。到此BDB XML PHP全部安装成功。在实际应用中，需要特别注意帐户和权限问题：要保证Apache的运行帐户对容器(Container)文件及其所在目录有读写权限。
范例
从开心网的群共享页面http://www.kaixin001.com/group/file.php?gid=627784&#038;fid=450163&#038;start=0下载附件xmlData.tar.gz，解压后，将xmlData目录下的所有文件拷贝到http根目录下，然后执行：
./gen_cont.sh $HOME/dbxml-2.5.13/install/bin/dbxml
脚本即会生成一个容器：simple.dbxml。该容器内包含三百多个xml文档，形如：
&#60;?xml version="1.0"?&#62;
&#60;产品&#62;
    &#60;种类&#62;fruits&#60;/种类&#62;
    &#60;商品&#62;Avocado&#60;/商品&#62;
    &#60;存货&#62;
 [...]]]></description>
			<content:encoded><![CDATA[<p>近十年来，XML应用越发广泛，政府也推出了《基于XML的电子公文格式规范》等标准。那么，在需要XML数据库引擎的情况下，采用原生XML数据库Berkeley DB XML(以下简称BDB XML)取代MySQL(或其它传统DB)做后台数据库是一个更好的选择。</p>
<p>BDB XML是Oracle推出的一款开源原生XML数据库。与传统数据库相比，原生XML数据库的优势有：<br />
1. 可以直接操作XML文件，XML数据无损&#8211;在某些场合，无损的数据源意味着法律效力。<br />
2. 原生检索方式，支持XQuery和XPath，符合XML习惯。<br />
3. 性能优化：原生XML数据库会针对XML特点进行各种优化，如插入文档索引、建立节点ID等。<br />
4. 支持相同数据的不同视图。</p>
<p>和其它原生XML数据库相比，BDB XML优势有：<br />
1. 完整的ACID 事务处理、自动恢复、热备份、用于分布式事务的HA支持。<br />
2. 支持XQuery(含XQuery Update)和XPATH。<br />
3. 可以利用其特有的二进制元数据存取大容量二进制对象(非XML数据)。<br />
4. 支持全Unicode字符集，中文存储、查询都不成问题。<br />
5. 提供一套容器和迭代器接口访问和操作查询结果。<br />
6. 提供交互式命令行工具。<br />
<span id="more-618"></span><br />
以上第三点是一个非常实用的特性，某种程度上它补足了XML应用的”最后一公里“：比方说，你正在为教育部门开发一个考生管理数据库，需要将考生的资料存成XML文档，那么存取照片(二进制数据)就相当麻烦。一般来讲传统的选择有两种：一是转换为Base64Binary格式嵌入到XML文档中，这意味着存取两端都需要转换大量图片数据，效率就很低下;二是为每个照片生成一个引用再另存它处，只在XML文档中保留一个引用，这种方法不但复杂，而且把数据从文档中分割了出来，损失了ACID特性，管理不便。而使用BDB XML就可以将照片数据直接以二进制元数据的形式嵌入到XML文档中，存取都非常方便，还可以基于数据库实现图像/视频检索。</p>
<p>下面，介绍一下BDB XML PHP的安装过程：</p>
<h2>安装Apache+PHP环境</h2>
<p>好吧，这是一个烂大街的话题，网上一抓一大把。下面以Debian 5.0和apache2为例：<br />
用aptitude安装以下软件包：</p>
<pre>
apache2
libapache2-mod-php5
php5
php5-dev
php5-cgi</pre>
<p>安装完毕。启动Apache服务器：</p>
<pre>sudo /etc/init.d/apache2 start</pre>
<p>测试一下是否安装成功，首先找到http的根目录(本机环境是/var/www)，在该目录下生成php测试文件test.php(内容如下)：</p>
<blockquote><p>&lt;?phpinfo();?&gt;</p></blockquote>
<p>用浏览器打开网页服务器的test.php，如果安装成功，会打开php信息页。</p>
<h2>安装BDB XML PHP</h2>
<p>移步http://www.oracle.com/technology/software/products/berkeley-db/xml/index.html下载源码包dbxml-2.5.13.tar.gz，并放置在$HOME目录下。下面以Linux上的安装为例：</p>
<pre>
cd $HOME
tar zxf dbxml-2.5.13.tar.gz
cd dbxml-2.5.13
./buildall
cd db-4.8.24/php_db4
phpize
./configure --with-db4=$PWD/../../install
make
sudo make install
cd ../../dbxml/src/php/
phpize
./configure --with-dbxml=$PWD/../../../install
make
sudo make install
</pre>
<p>接下来编辑/etc/php5/apache2/php.ini和/etc/php5/cgi/php.ini文件(可能路径略有不同)，把以下两行加到Dynamic Extensions段：</p>
<pre>extension=db4.so
extension=dbxml.so</pre>
<p>大功告成，为保安全，最好重启一下Apache服务器。到此BDB XML PHP全部安装成功。在实际应用中，需要特别注意帐户和权限问题：<span style="color: #ff0000;"><strong>要保证Apache的运行帐户对容器(Container)文件及其所在目录有读写权限。</strong></span></p>
<h2>范例</h2>
<p>从开心网的群共享页面http://www.kaixin001.com/group/file.php?gid=627784&#038;fid=450163&#038;start=0下载附件xmlData.tar.gz，解压后，将xmlData目录下的所有文件拷贝到http根目录下，然后执行：</p>
<pre>./gen_cont.sh $HOME/dbxml-2.5.13/install/bin/dbxml</pre>
<p>脚本即会生成一个容器：simple.dbxml。该容器内包含三百多个xml文档，形如：</p>
<pre>&lt;?xml version="1.0"?&gt;
&lt;产品&gt;
    &lt;种类&gt;fruits&lt;/种类&gt;
    &lt;商品&gt;Avocado&lt;/商品&gt;
    &lt;存货&gt;
        &lt;库存量单位&gt;AvocfruijfHs18&lt;/库存量单位&gt;
        &lt;价格&gt;0.24&lt;/价格&gt;
        &lt;存货&gt;393&lt;/存货&gt;
    &lt;/存货&gt;
    &lt;厂家&gt;Simply Fresh&lt;/厂家&gt;
&lt;/产品&gt;</pre>
<p>使用浏览器访问服务器上的simple.php页面，即可看到转换后输出的数据表。simple.php的内容如下：</p>
<pre>&lt;html&gt;
&lt;body&gt;
&lt;?
$contName = 'simple.dbxml'; // Container名字

// 创建Manager和Context
$mgr = new XmlManager();
$qc = $mgr-&gt;createQueryContext(); // Query Context
$qc-&gt;setDefaultCollection($contName); // 设置默认Container

// 打开Container
$cont = $mgr-&gt;openContainer($contName);

// 创建XQuery查询表达式，将数据提取出来并转换为html表格
$query = 'for $产品 in collection()/产品';
$query .= ' return &lt;tr&gt;';
$query .= '&lt;td&gt;{$产品/种类/string()}&lt;/td&gt;';
$query .= '&lt;td&gt;{$产品/商品/string()}&lt;/td&gt;';
$query .= '&lt;td&gt;{$产品/存货/价格/string()}&lt;/td&gt;';
$query .= '&lt;td&gt;{$产品/存货/存货/string()}&lt;/td&gt;';
$query .= '&lt;td&gt;{$产品/厂家/string()}&lt;/td&gt;';
$query .= '&lt;/tr&gt;';

// 输出表格头
?&gt;&lt;table width='100%' border='frame'&gt;
&lt;tr&gt;&lt;td&gt;种类&lt;/td&gt;&lt;td&gt;商品&lt;/td&gt;&lt;td&gt;价格&lt;/td&gt;&lt;td&gt;存货&lt;/td&gt;&lt;td&gt;厂家&lt;/td&gt;&lt;/tr&gt;&lt;?

// 查询并遍历结果，输出到表格
$results = $mgr-&gt;query($query, $qc);
while ($results-&gt;hasNext())
echo $results-&gt;next()-&gt;asString();

// 输出表格尾
?&gt;&lt;/table&gt;&lt;?
?&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>可见，只需30余行的代码就能完成xml数据库到网页表格的转换。例图：<br />
<img src="http://www.bdbchina.com/wp-content/uploads/2009/10/bdb_xml_php_web.png" alt="bdb_xml_php_web" title="bdb_xml_php_web" width="500" height="500" class="alignnone size-full wp-image-641" /></p>
<h2>总结</h2>
<p>至此，我们已经介绍了BDB XML PHP的安装和使用。至于更多BDB XML功能，如二进制元数据、环境、事务、排序、索引等，请关注后续文章。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/10/%e9%87%87%e7%94%a8berkeley-db-xml-php%e5%bb%ba%e7%ab%8b%e5%8e%9f%e7%94%9fxml-web%e6%9c%8d%e5%8a%a1%e5%99%a8/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Berkeley DB Xml 入门系列之三： 使用Berkeley DB Xml Shell</title>
		<link>http://www.bdbchina.com/2009/08/berkeley-db-xml-%e5%85%a5%e9%97%a8%e7%b3%bb%e5%88%97%e4%b9%8b%e4%b8%89%ef%bc%9a-%e4%bd%bf%e7%94%a8berkeley-db-xml-shell/</link>
		<comments>http://www.bdbchina.com/2009/08/berkeley-db-xml-%e5%85%a5%e9%97%a8%e7%b3%bb%e5%88%97%e4%b9%8b%e4%b8%89%ef%bc%9a-%e4%bd%bf%e7%94%a8berkeley-db-xml-shell/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 09:39:23 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[Berkeley DB XML]]></category>
		<category><![CDATA[赵汝聪]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=511</guid>
		<description><![CDATA[Berkeley DB Xml Shell(以下简称DbXml Shell)是包含在发行包里的工具，可运行于UNIX家族平台(Linux, Solaris, HP-UX, Mac OS, Cygwin, AIX, FreeBSD...)和Windows平台上。DbXml Shell包含Berkeley DB XML的绝大多数常用功能，可以让我们在不编写一行代码的情况下，通过指令快速完成多种复杂操作。]]></description>
			<content:encoded><![CDATA[<h2>1. 简介</h2>
<p>
  <br />Berkeley DB Xml Shell(以下简称DbXml Shell)是包含在发行包里的工具，可运行于UNIX家族平台(Linux, Solaris, HP-UX, Mac OS, Cygwin, AIX, FreeBSD&#8230;)和Windows平台上。DbXml Shell包含Berkeley DB XML的绝大多数常用功能，可以让我们在不编写一行代码的情况下，通过指令快速完成多种常用操作如创建/删除容器、插入/删除文档、查询、验证Query Plan等等，实为居家旅行必备佳品。要是在周五下午遭受紧急任务袭击，就更得靠它来拯救周末了。有时为了解决开发中遇到的问题，只要写一个非常简短的DbXml Shell脚本就可以实现预期功能或是重现环境，极大地提高了劳动生产率。</p>
<p><span id="more-511"></span></p>
<div>
<div id='extendedEntryBreak' name='extendedEntryBreak'></div>
</div>
<p>在使用DbXML shell之前，应当正确编译好Berkeley DB Xml库。具体编译过程请参考博客上的相关文章：<br />
  <br /><a href="http://www.bdbchina.com/2009/07/berkeley-db-xml-complie-on-linux/">Berkeley DB Xml 入门系列之二： 在Linux下编译和使用Berkeley DB Xml</a></p>
<p><a href="http://www.bdbchina.com/2009/04/使用visual-c-2008-express-edition-编译oracle-berkeley-db-xml/">使用Visual C++ 2008 Express Edition 编译Oracle Berkeley DB XML</a></p>
<h2>2. 运行</h2>
<p>
  <br />UNIX下的可执行文件为&lt;dbxml&gt;/install/bin/dbxml，Windows环境下为&lt;dbxml&gt;/bin/dbxml.exe。钻进DbXml Shell以前，先瞄一眼说明(中文是翻译的，发行版是E文的)</p>
<blockquote>
<p>rucong@debian:~/dbxml/install/bin$ ./dbxml –?<br />
    <br />选项: </p>
<p>-c 在-h选项所指定的路径中创建一个新的Berkeley DB环境。 </p>
<p>-h &lt;home&gt; 使用指定的路径作为Berkeley DB环境(默认为当前路径)。 </p>
<p>-P &lt;password&gt; 设置数据库的密码 </p>
<p>-s &lt;script&gt; 执行一个或多个脚本文件 </p>
<p>-t 打开事务功能(transaction mode) </p>
<p>-V 打印版本号 </p>
<p>-v verbose模式，连用两次进入更详细的verbose模式. </p>
<p>-x 安全模式–禁止在XQuery中直接访问本地文件和网络 </p>
<p>-z &lt;size&gt; 设置环境Cache大小为&lt;size&gt;Mb (默认: 64) </p>
<p>-? 本说明</p>
</blockquote>
<h2>3. 指令说明</h2>
<p>
  <br />进入shell: </p>
<blockquote>
<p>rucong@debian:~/dbxml/install/bin$./dbxml</p>
</blockquote>
<p>嗯，已经进入DbXml Shell环境了。还是请help为我们向导一下(嗯&#8230;中文是翻译的，发行版是E文的。排序是按名称的，名词是不译的。列出的是常用的，实际还有更多的)</p>
<table cellspacing="0" cellpadding="2" width="400" border="0">
<tbody>
<tr>
<td valign="top" width="105"># </td>
<td valign="top" width="295">注释符，在脚本中可用#来做注释</td>
</tr>
<tr>
<td valign="top" width="105">abort</td>
<td valign="top" width="295">取消当前事务</td>
</tr>
<tr>
<td valign="top" width="105">addAlias</td>
<td valign="top" width="295">为默认Container增加一个别名</td>
</tr>
<tr>
<td valign="top" width="105">addIndex</td>
<td valign="top" width="295">为默认Container增加一个Index</td>
</tr>
<tr>
<td valign="top" width="105">commit</td>
<td valign="top" width="295">提交当前Transaction，同时自动创建一个新Transaction</td>
</tr>
<tr>
<td valign="top" width="105">compactContainer</td>
<td valign="top" width="295">压缩Container</td>
</tr>
<tr>
<td valign="top" width="105">contextQuery</td>
<td valign="top" width="295">使用上一次查询结果作为上下文，可限定后续查询在已返回的结果中进行</td>
</tr>
<tr>
<td valign="top" width="105">cquery</td>
<td valign="top" width="295">在默认Container中进行查询，本指令和query的不同之处在于省略了显式collection()</td>
</tr>
<tr>
<td valign="top" width="105">createContainer</td>
<td valign="top" width="295">创建一个新的Container，并将其作为默认Container</td>
</tr>
<tr>
<td valign="top" width="105">delIndex</td>
<td valign="top" width="295">在默认Container中删除一条Index</td>
</tr>
<tr>
<td valign="top" width="105">getDocuments</td>
<td valign="top" width="295">获得Container里的所有文档</td>
</tr>
<tr>
<td valign="top" width="105">getMetaData</td>
<td valign="top" width="295">获得指定Document里的metadata</td>
</tr>
<tr>
<td valign="top" width="105">help</td>
<td valign="top" width="295">获得帮助信息。可以对某条指令进行特殊说明，如help putdocument</td>
</tr>
<tr>
<td valign="top" width="105">info</td>
<td valign="top" width="295">获得默认Container的信息</td>
</tr>
<tr>
<td valign="top" width="105">listIndexes</td>
<td valign="top" width="295">列出所有Index</td>
</tr>
<tr>
<td valign="top" width="105">lookupIndex</td>
<td valign="top" width="295">在默认Container中查找Index</td>
</tr>
<tr>
<td valign="top" width="105">lookupStats</td>
<td valign="top" width="295">在默认Container中查看Index状态</td>
</tr>
<tr>
<td valign="top" width="105">openContainer</td>
<td valign="top" width="295">打开一个Container并设置为默认Container</td>
</tr>
<tr>
<td valign="top" width="105">prepare</td>
<td valign="top" width="295">把指定的XQuery表达式预处理为默认Query表达式(default pre-parsed query)，这样就可以快速地重复执行该Query</td>
</tr>
<tr>
<td valign="top" width="105">print</td>
<td valign="top" width="295">输出执行的结果，可输出到文件</td>
</tr>
<tr>
<td valign="top" width="105">putDocument</td>
<td valign="top" width="295">往Container里插入XML文档</td>
</tr>
<tr>
<td valign="top" width="105">query</td>
<td valign="top" width="295">执行指定的XQuery表达式，如无特殊指定，执行的就是prepare指令中预处理好的XQuery表达式</td>
</tr>
<tr>
<td valign="top" width="105">queryPlan</td>
<td valign="top" width="295">输出query plan。用来查看被优化后的表达式执行计划，同时可检查设置的Index是否生效</td>
</tr>
<tr>
<td valign="top" width="105">quit</td>
<td valign="top" width="295">退出程序。如果是用-s执行脚本文件，切记在结尾处加上这一句，不然程序会赖着不退出的</td>
</tr>
<tr>
<td valign="top" width="105">removeAlias</td>
<td valign="top" width="295">删除一个Container的别名</td>
</tr>
<tr>
<td valign="top" width="105">removeContainer</td>
<td valign="top" width="295">删除一个Container</td>
</tr>
<tr>
<td valign="top" width="105">removeDocument</td>
<td valign="top" width="295">在Container中删除一个Document</td>
</tr>
<tr>
<td valign="top" width="105">run</td>
<td valign="top" width="295">执行指定的脚本文件</td>
</tr>
<tr>
<td valign="top" width="105">setBaseUri</td>
<td valign="top" width="295">设置/获取 默认context的base URI</td>
</tr>
<tr>
<td valign="top" width="105">setLazy</td>
<td valign="top" width="295">设置Query为Lazy还是Eager</td>
</tr>
<tr>
<td valign="top" width="105">setMetaData</td>
<td valign="top" width="295">为指定的Document设置一个metadata</td>
</tr>
<tr>
<td valign="top" width="105">setNamespace</td>
<td valign="top" width="295">为默认Context创建一个&quot;prefix-&gt;namespace&quot;绑定</td>
</tr>
<tr>
<td valign="top" width="105">setQueryTimeout</td>
<td valign="top" width="295">设置Query的超时时间</td>
</tr>
<tr>
<td valign="top" width="105">setVerbose</td>
<td valign="top" width="295">设置Verbose级别</td>
</tr>
<tr>
<td valign="top" width="105">time</td>
<td valign="top" width="295">计时。可用来计算指令的执行时间</td>
</tr>
<tr>
<td valign="top" width="105">transaction</td>
<td valign="top" width="295">创建一个事务，用于所有后续操作</td>
</tr>
<tr>
<td valign="top" width="105">upgradeContainer</td>
<td valign="top" width="295">把老版本的XmlContainer升级到现版本</td>
</tr>
</tbody>
</table>
<p>接下来让我们小试牛刀，运行几个常用命令试试：</p>
<p>创建一个空Container</p>
<blockquote>
<p>dbxml&gt; createcontainer &quot;&quot;<br />
    <br />Creating node storage container</p>
</blockquote>
<p>插入一个文档test.xml：</p>
<blockquote>
<p>dbxml&gt; putdocument test.xml &#8216;&lt;root&gt;&lt;a&gt;&lt;b/&gt;&lt;/a&gt;&lt;/root&gt;&#8217;<br />
    <br />Document added, name = test.xml</p>
</blockquote>
<p>看看文档插入了没：</p>
<blockquote>
<p>dbxml&gt; getdocuments<br />
    <br />1 documents found</p>
</blockquote>
<p>检查文档名称：</p>
<blockquote>
<p>dbxml&gt; printname<br />
    <br />test.xml</p>
</blockquote>
<p>检查文档内容：</p>
<blockquote>
<p>dbxml&gt; print<br />
    <br />&lt;root&gt;&lt;a&gt;&lt;b/&gt;&lt;/a&gt;&lt;/root&gt;</p>
</blockquote>
<p>做个简单查询，并计时：</p>
<blockquote>
<p>dbxml&gt; time query collection()/root/a<br />
    <br />1 objects returned for eager expression ‘collection()/root/a’ </p>
<p>Time in seconds for command ‘query’: 0.04848</p>
</blockquote>
<p>输出查询结果：</p>
<blockquote>
<p>dbxml&gt; print<br />
    <br />&lt;a&gt;&lt;b/&gt;&lt;/a&gt;</p>
</blockquote>
<p>退出</p>
<blockquote>
<p>dbxml&gt; print<br />
    <br />&lt;a&gt;&lt;b/&gt;&lt;/a&gt;</p>
</blockquote>
<h2>4.范例</h2>
<p>
  <br />上一节我们在DbXml Shell里做了一些简单的交互式操作，实际上我们采用DbXml Shell脚本更方便。下面是一个简单的DbXml Shell脚本，高级内容参见源代码包里的dbxml/docs/intro_xml/BerkeleyDBXML-Intro.pdf </p>
<blockquote>
<p>createContainer &quot;&quot; #创建一个空Container</p>
<p>#插入一个文档 </p>
<p></p>
<p>putdocument apples.xml &#8216; </p>
<p>&lt;product&gt;<br />
    <br />&lt;category&gt;fruits&lt;/category&gt; </p>
<p>&lt;item&gt;Apples&lt;/item&gt; </p>
<p>&lt;inventory&gt; </p>
<p>&lt;sku&gt;Applfrui1q6lpq&lt;/sku&gt; </p>
<p>&lt;price&gt;1.10&lt;/price&gt; </p>
<p>&lt;inventory&gt;535&lt;/inventory&gt; </p>
<p>&lt;/inventory&gt; </p>
<p>&lt;vendor&gt;Off the Vine&lt;/vendor&gt; </p>
<p>&lt;/product&gt; </p>
<p>&#8216; </p>
<p>getdocuments #获得所有文档 </p>
<p>printnames #输出文档名 </p>
<p>print #输出文档内容 </p>
<p>#使用XQuery查询价格,并计量查询时间<br />
    <br />time query &#8216;collection()/product/inventory/price/string()&#8217; </p>
<p>echo &quot;Price is:&quot; </p>
<p>print </p>
<p>exit #退出</p>
</blockquote>
<p>执行并输出结果： </p>
<blockquote>
<p>rucong@debian:~/dbxml/install/bin$ ./dbxml -s example1.script<br />
    <br />apples.xml</p>
<p>&lt;product&gt;<br />
    <br />&lt;category&gt;fruits&lt;/category&gt; </p>
<p>&lt;item&gt;Apples&lt;/item&gt; </p>
<p>&lt;inventory&gt; </p>
<p>&lt;sku&gt;Applfrui1q6lpq&lt;/sku&gt; </p>
<p>&lt;price&gt;1.10&lt;/price&gt; </p>
<p>&lt;inventory&gt;535&lt;/inventory&gt; </p>
<p>&lt;/inventory&gt; </p>
<p>&lt;vendor&gt;Off the Vine&lt;/vendor&gt; </p>
<p>&lt;/product&gt;</p>
<p>Time in seconds for command ‘query’: 0.008049<br />
    <br />Price is: </p>
<p>1.10</p>
</blockquote>
<h2>5.使用技巧</h2>
<p><strong>rlwrap是个好东西</strong></p>
<p>UNIX用户初用DbXml Shell时，会悲愤地发现bash标配的命令行历史和左右箭头键居然统统废掉。呃&#8230;这意味着键入命令的过程中不能犯错，还不能重复历史指令，极不人道。因此该问题也凭借强大的怨念名列FAQ。其实只要使用rlwrap这个小工具便可以完美地解决这一问题(没有就装一个吧)，rlwrap程序可以添加命令历史和命令编辑功能。用法：rlwrap ./dbxml。这体现了UNIX世界的哲学：把工具们连接在一起，而不是重复实现。</p>
<p>下面这条是OTN上荣列BestPractices的一条经验(作者是Greg Fausak)：</p>
<blockquote>
<p>/usr/bin/rlwrap -m -c -H ~/.rlhistory -l ~/dbxml.log -r -m -P &#8216;openC customer.dbxml \ adda L \ setN &quot;test&quot; &quot;http://mytest.com/&quot;&#8217; /usr/local/bin/dbxml -h ~/sn/db</p>
<p>-H : 把命令执行历史存储在文件.rlhistory<br />
    <br />-l : 把产生的所有的输入和输出存储在文件~/dbxml.log&#8217; </p>
<p>-m : 使能多行命令，和下面的-P选项连用。 -P &quot;&#8230;&quot; 里面的反斜杠\就是分行标识，用来分隔多个命令。 </p>
<p>-P : 在执行操作前，自动输入一批指令。由于DbXml Shell可以执行脚本文件，所以总的说来rlwrap的&quot;-m&quot;和&quot;-P&quot;选项对我们用处不大，可以无视。 </p>
<p>-h 这个是DbXml Shell的参数，指定Berkeley DB环境路径</p>
</blockquote>
<p><strong></strong></p>
<p><strong>创建一个临时Container<br />
    <br /></strong>如果只是做个临时实验，不想大费周章地创建Container文件和DB环境，那么只需要创建一个名字为空的Container就行了。DbXml会在内存中创建一个临时的Container，有需要的话还可以用addAlias为这个空名Container增加别名。</p>
<p>
  <br /><strong>不用输入完整指令<br />
    <br /></strong>Shell会自动补完符合唯一性的指令：比如createc=createContainer，listi=listIndex&#8230;</p>
<p>
  <br /><strong>修改Shell代码<br />
    <br /></strong>Shell不是万能的，如果发现Shell的功能比实际需求就恰巧少了那么一点点，又不想从头编写一套C++/Java程序，那么就Open Source精神来武装头脑指导实践推动工作 &#8212; 杀进DbXml Shell源代码里面修改吧！Shell的源程序在dbxml/src/util/shell目录下，组织得非常规范，只要有初步DbXml编程经验就可以对Shell进行修改和增强。修改之后进入dbxml/build_unix，重新&quot;make; make install&quot;即可。Visual Studio环境下就更方便，重新编译Shell的Project就行了。比如OTN上曾有用户问如何用Shell获得整个Container的MetaData(Shell的getMetaData只能获得一个Document的MetaData)，解决办法就是修改dbxml/src/utils/shell/GetMetaDataCommand.cpp，增加一条循环调用就行了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/08/berkeley-db-xml-%e5%85%a5%e9%97%a8%e7%b3%bb%e5%88%97%e4%b9%8b%e4%b8%89%ef%bc%9a-%e4%bd%bf%e7%94%a8berkeley-db-xml-shell/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>DOS仿真阅读器</title>
		<link>http://www.bdbchina.com/2009/03/dos%e4%bb%bf%e7%9c%9f%e9%98%85%e8%af%bb%e5%99%a8/</link>
		<comments>http://www.bdbchina.com/2009/03/dos%e4%bb%bf%e7%9c%9f%e9%98%85%e8%af%bb%e5%99%a8/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 15:30:02 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[程序设计]]></category>
		<category><![CDATA[赵汝聪]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=93</guid>
		<description><![CDATA[五年多前做了一个DOS下的电子小说阅读器。一晃五年过去了，几乎忘记了它的存在。上周忽然收到广告邮件：“DOS仿真阅读器做的很不错，现在已经有超过9939人下载过它&#8230;”，才猛然想起这位失散多年的小兄弟。今天下载人数突破了一万，貌似是个值得纪念的日子。虽然比同类大哥Adobe Reader相比实在是可怜巴巴，不过屈指一算，平均每天有五位素昧平生的用户下载，DOS又式微多年，也算是一个不大不小的意外。

先介绍一下我的战友：2002年寒假花400块钱在旧货市场淘到的二手Compaq 486笔记本，屏幕比华硕Eee PC还小，机身比15寸笔记本还壮硕。66MHz CPU，4M内存，250M硬盘(实际没有250M，中间有三四十M的坏块)。屏幕和机身的连接轴已经失效了，需要用一块有机玻璃恭恭敬敬地把它架起来。所幸软驱和并口还是好的，可以凑和着往里面灌东西。
用这么一台老古董，无非是玩玩DOS游戏，看看电子小说。老DOS用户都熟悉知名程序员云风写的一个牛掰的电子小说阅读软件C-View，支持N多的功能。唯一的遗憾就是全屏分行，按行滚动。阅读时眼睛或脖子需要不停地左右往复，实是累坏吾等老汉。

总而言之，看小说还是要那种仿书页样式的，这样才有看书的感觉。看的时候左一页，右一页，看完左页看右页，看完前页看后页&#8230;  可惜寻觅半天，在DOS下还是找不到合适的阅读器。那就只好自己写一个吧，所幸不难。猛蹲一阵图书馆和宿舍，炮制出来一个能工作的程序，从此终于可以用它来安详地看书了。

在华军上的简介(http://www.newhua.com/soft/22394.htm)：
唯一的DOS仿真书页样式阅读器,模拟左右翻页的书页样式。自带中文GB字库，无需汉字系统支持，无需EMS或XMS。硬件级的色彩调整,可由用户设定2 万多种颜色.可设定背景、 字体、页码等页面所有元素颜色。并提供四种调色方案的设定、保存和快速切换。文件选择采用磁盘目录列表选择，并配有预览功能。能打开任意大小的文本文件。

DOS仿真阅读器在电脑里保存了两年，直至05年本科毕业。至于陪伴了我三年的486笔记本，在毕业前夕转让给了师弟，也许现在这个老机器早已停止运转了吧。用它打穿的DOS游戏早已不计其数：大航海时代II、英杰传、炎龙骑士团、波斯王子、三国志IV、轩辕剑II&#8230;&#8230;嗯，又想起了扛着一盒软盘去学校机房拷游戏的时光。
]]></description>
			<content:encoded><![CDATA[<p>五年多前做了一个DOS下的电子小说阅读器。一晃五年过去了，几乎忘记了它的存在。上周忽然收到广告邮件：“DOS仿真阅读器做的很不错，现在已经有超过9939人下载过它&#8230;”，才猛然想起这位失散多年的小兄弟。今天下载人数突破了一万，貌似是个值得纪念的日子。虽然比同类大哥Adobe Reader相比实在是可怜巴巴，不过屈指一算，平均每天有五位素昧平生的用户下载，DOS又式微多年，也算是一个不大不小的意外。<br />
<span id="more-93"></span><br />
先介绍一下我的战友：2002年寒假花400块钱在旧货市场淘到的二手Compaq 486笔记本，屏幕比华硕Eee PC还小，机身比15寸笔记本还壮硕。66MHz CPU，4M内存，250M硬盘(实际没有250M，中间有三四十M的坏块)。屏幕和机身的连接轴已经失效了，需要用一块有机玻璃恭恭敬敬地把它架起来。所幸软驱和并口还是好的，可以凑和着往里面灌东西。</p>
<p>用这么一台老古董，无非是玩玩DOS游戏，看看电子小说。老DOS用户都熟悉知名程序员云风写的一个牛掰的电子小说阅读软件C-View，支持N多的功能。唯一的遗憾就是全屏分行，按行滚动。阅读时眼睛或脖子需要不停地左右往复，实是累坏吾等老汉。</p>
<p><img class="alignnone size-full wp-image-174" title="s1" src="http://www.bdbchina.com/wp-content/uploads/2009/03/s1.png" alt="s1" width="100%" /></p>
<p>总而言之，看小说还是要那种仿书页样式的，这样才有看书的感觉。看的时候左一页，右一页，看完左页看右页，看完前页看后页&#8230;  可惜寻觅半天，在DOS下还是找不到合适的阅读器。那就只好自己写一个吧，所幸不难。猛蹲一阵图书馆和宿舍，炮制出来一个能工作的程序，从此终于可以用它来安详地看书了。</p>
<p><img class="alignnone size-full wp-image-175" title="s2" src="http://www.bdbchina.com/wp-content/uploads/2009/03/s2.png" alt="s2" width="100%" /></p>
<p>在华军上的简介(http://www.newhua.com/soft/22394.htm)：</p>
<p>唯一的DOS仿真书页样式阅读器,模拟左右翻页的书页样式。自带中文GB字库，无需汉字系统支持，无需EMS或XMS。硬件级的色彩调整,可由用户设定2 万多种颜色.可设定背景、 字体、页码等页面所有元素颜色。并提供四种调色方案的设定、保存和快速切换。文件选择采用磁盘目录列表选择，并配有预览功能。能打开任意大小的文本文件。</p>
<p><img class="alignnone size-full wp-image-176" title="s3" src="http://www.bdbchina.com/wp-content/uploads/2009/03/s3.png" alt="s3" width="100%" /></p>
<p>DOS仿真阅读器在电脑里保存了两年，直至05年本科毕业。至于陪伴了我三年的486笔记本，在毕业前夕转让给了师弟，也许现在这个老机器早已停止运转了吧。用它打穿的DOS游戏早已不计其数：大航海时代II、英杰传、炎龙骑士团、波斯王子、三国志IV、轩辕剑II&#8230;&#8230;嗯，又想起了扛着一盒软盘去学校机房拷游戏的时光。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/03/dos%e4%bb%bf%e7%9c%9f%e9%98%85%e8%af%bb%e5%99%a8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>利用stderr创建空白文本文件</title>
		<link>http://www.bdbchina.com/2009/03/%e5%88%a9%e7%94%a8stderr%e5%88%9b%e5%bb%ba%e7%a9%ba%e7%99%bd%e6%96%87%e6%9c%ac%e6%96%87%e4%bb%b6/</link>
		<comments>http://www.bdbchina.com/2009/03/%e5%88%a9%e7%94%a8stderr%e5%88%9b%e5%bb%ba%e7%a9%ba%e7%99%bd%e6%96%87%e6%9c%ac%e6%96%87%e4%bb%b6/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 10:29:58 +0000</pubDate>
		<dc:creator>赵汝聪</dc:creator>
				<category><![CDATA[程序设计]]></category>
		<category><![CDATA[赵汝聪]]></category>
		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://www.bdbchina.com/?p=135</guid>
		<description><![CDATA[在Windows脚本里面创建空白文本文件真是困难重重。采用 echo &#62;tmp.txt是不行的，因为echo会可耻地输出&#8221;echo on&#8221;。再试试&#8221;echo off&#8221;+&#8221;echo on&#8221;的组合拳？依然毫无效果。猛然惊觉系统还有闲置的一条康庄大道stderr，使用之：
echo 2&#62; tmp.txt
stderr没有任何输出，自然产生一个空白文本文件。整个世界清静了&#8230;
]]></description>
			<content:encoded><![CDATA[<p>在Windows脚本里面创建空白文本文件真是困难重重。采用 echo &gt;tmp.txt是不行的，因为echo会可耻地输出&#8221;echo on&#8221;。再试试&#8221;echo off&#8221;+&#8221;echo on&#8221;的组合拳？依然毫无效果。猛然惊觉系统还有闲置的一条康庄大道stderr，使用之：</p>
<p>echo 2&gt; tmp.txt</p>
<p>stderr没有任何输出，自然产生一个空白文本文件。整个世界清静了&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bdbchina.com/2009/03/%e5%88%a9%e7%94%a8stderr%e5%88%9b%e5%bb%ba%e7%a9%ba%e7%99%bd%e6%96%87%e6%9c%ac%e6%96%87%e4%bb%b6/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
Դ