odbc.sgml
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:29k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. <Chapter Id="odbc">
  2. <DocInfo>
  3. <AuthorGroup>
  4. <Author>
  5. <FirstName>Tim</FirstName>
  6. <Surname>Goeke</Surname>
  7. </Author>
  8. <Author>
  9. <FirstName>Thomas</FirstName>
  10. <Surname>Lockhart</Surname>
  11. </Author>
  12. </AuthorGroup>
  13. <Date>1998-10-21</Date>
  14. </DocInfo>
  15. <Title>ODBC Interface</Title>
  16. <Note>
  17. <Para>
  18. Background information originally by
  19.  <ULink url="mailto:tgoeke@xpressway.com">Tim Goeke</ULink>
  20. </Para>
  21. </Note>
  22. <Para>
  23. <acronym>ODBC</acronym> (Open Database Connectivity) is an abstract 
  24. <acronym>API</acronym> 
  25. which allows you to write applications which can interoperate
  26. with various <acronym>RDBMS</acronym> servers.
  27. <acronym>ODBC</acronym> provides a product-neutral interface 
  28. between frontend applications and database servers,
  29. allowing a user or developer to write applications which are 
  30. transportable between servers from different manufacturers..
  31. </Para>
  32. <Sect1>
  33. <Title>Background</Title>
  34. <Para>
  35. The <acronym>ODBC</acronym> <acronym>API</acronym> matches up 
  36. on the backend to an <acronym>ODBC</acronym>-compatible data source.
  37. This could be anything from a text file to an Oracle or 
  38. <productname>Postgres</productname> <acronym>RDBMS</acronym>.
  39. </Para>
  40. <Para>
  41. The backend access come from <acronym>ODBC</acronym> drivers, 
  42. or vendor specifc drivers that
  43. allow data access.   <productname>psqlODBC</productname> is such a driver,
  44.  along with others that are
  45. available, such as the OpenLink <acronym>ODBC</acronym> drivers.
  46. </Para>
  47. <Para>
  48. Once you write an <acronym>ODBC</acronym> application, 
  49. you <emphasis>should</emphasis> be able to connect to <emphasis>any</emphasis>
  50. back end database, regardless of the vendor, as long as the database schema
  51. is the same.
  52. </Para>
  53. <Para>
  54. For example. you could have <productname>MS SQL Server</productname>
  55.  and <productname>Postgres</productname> servers which have
  56. exactly the same data.  Using <acronym>ODBC</acronym>, 
  57. your Windows application would make exactly the
  58. same calls and the back end data source would look the same (to the Windows
  59. app).
  60. </Para>
  61. <para>
  62. <ulink url="http://www.insightdist.com/">Insight Distributors</ulink> 
  63. provides active and ongoing
  64. support for the core <productname>psqlODBC</productname> distribution. 
  65. They provide a
  66. <ulink url="http://www.insightdist.com/psqlodbc/"><acronym>FAQ</acronym></ulink>,
  67.  ongoing development on the code base, and actively participate on the 
  68. <ulink url="mailto:interfaces@postgresql.org">interfaces mailing list</ulink>.
  69. </Para>
  70. </sect1>
  71. <sect1>
  72. <title><productname>Windows</productname> Applications</title>
  73. <Para>
  74. In the real world, differences in drivers and the level of 
  75. <acronym>ODBC</acronym> support
  76. lessens the potential of <acronym>ODBC</acronym>:
  77. <ItemizedList Mark="bullet" Spacing="compact">
  78. <ListItem>
  79. <Para>
  80. Access, Delphi, and Visual Basic all support <acronym>ODBC</acronym> directly.
  81. </Para>
  82. </listitem>
  83. <ListItem>
  84. <Para>
  85. Under C++, such as Visual C++, 
  86. you can use the C++ <acronym>ODBC</acronym> <acronym>API</acronym>.
  87. </Para>
  88. </listitem>
  89. <ListItem>
  90. <Para>
  91. In Visual C++, you can use the CRecordSet class, which wraps the 
  92. <acronym>ODBC</acronym> <acronym>API</acronym>
  93. set within an MFC 4.2 class.  This is the easiest route if you are doing
  94. Windows C++ development under Windows NT.
  95. </Para>
  96. </listitem>
  97. </ItemizedList>
  98. </Para>
  99. <sect2>
  100. <title>Writing Applications</title>
  101. <Para>
  102. <quote>
  103. If I write an application for <productname>Postgres</productname> 
  104. can I write it using <acronym>ODBC</acronym> calls
  105. to the <productname>Postgres</productname> server, 
  106. or is that only when another database program 
  107. like MS SQL Server or Access needs to access the data?</quote>
  108. </para>
  109. <Para>
  110. The <acronym>ODBC</acronym> <acronym>API</acronym>
  111. is the way to go.
  112. For <productname>Visual C++</productname> coding you can find out more at
  113. Microsoft's web site or in your <productname>VC++</productname> docs.
  114. </Para>
  115. <Para>
  116. Visual Basic and the other RAD tools have Recordset objects 
  117. that use <acronym>ODBC</acronym>
  118. directly to access data.  Using the data-aware controls, you can quickly
  119. link to the <acronym>ODBC</acronym> back end database 
  120. (<Emphasis>very</Emphasis> quickly).
  121. </Para>
  122. <Para>
  123. Playing around with MS Access will help you sort this out.  Try using
  124. <literal>File->Get External Data</literal>.
  125. </Para>
  126. <Tip>
  127. <Para>
  128. You'll have to set up a DSN first.
  129. </Para>
  130. </Tip>
  131. <!--
  132. <Para>
  133. <Tip>
  134. <Para>
  135. The <productname>Postgres</productname> datetime type will break MS Access.
  136. </Para>
  137. </Tip>
  138. -->
  139. </sect2>
  140. </sect1>
  141. <sect1>
  142. <title>Unix Installation</title>
  143. <para>
  144. <productname>ApplixWare</productname> has an 
  145. <acronym>ODBC</acronym> database interface
  146. supported on at least some platforms. 
  147. <productname>ApplixWare</productname> v4.4.1 has been
  148. demonstrated under Linux with <productname>Postgres</productname> v6.4 
  149. using the <productname>psqlODBC</productname>
  150. driver contained in the <productname>Postgres</productname> distribution.
  151. </Para>
  152. <sect2>
  153. <title>Building the Driver</title>
  154. <para>
  155. The first thing
  156. to note about the <productname>psqlODBC</productname> driver
  157.  (or any <acronym>ODBC</acronym> driver) is that there must
  158. exist a driver manager on the system where
  159.  the <acronym>ODBC</acronym> driver is to be
  160. used. There exists a freeware <acronym>ODBC</acronym> driver for Unix
  161.  called <productname>iodbc</productname> which
  162. can be obtained from various locations on the Net, including at
  163. <ulink url="http://www.as220.org/FreeODBC/iodbc-2.12.shar.Z">AS200</ulink>. 
  164. Instructions for installing <productname>iodbc</productname>
  165.  are beyond the scope of this
  166. document, but there is a <filename>README</filename>
  167.  that can be found inside the <productname>iodbc</productname> compressed
  168. .shar file that should explain how to get it up and running.
  169. </Para>
  170. <para>
  171. Having said that, any driver manager that you can find for your platform
  172. should support the <productname>psqlODBC</productname> driver
  173.  or any <acronym>ODBC</acronym> driver.
  174. </Para>
  175. <para>
  176. The Unix configuration files for <productname>psqlODBC</productname>
  177.  have recently been extensively
  178. reworked to allow for easy building on supported platforms as
  179. well as to allow for support of other Unix platforms in the future.
  180. The new configuration and build files for the driver should make it
  181. a simple process to build the driver on the supported platforms. Currently
  182. these include Linux and FreeBSD but we are hoping other users will
  183. contribute the necessary information to quickly expand the number of
  184. platforms for which the driver can be built.
  185. </Para>
  186. <para>
  187. There are actually two separate methods to build the driver depending on
  188. how you received it and these differences come down to only where and how to
  189. run <application>configure</application> and <application>make</application>. 
  190. The driver can be built in a standalone, client-only installation, or can be 
  191. built as a part of the main <productname>Postgres</productname> distribution.
  192. The standalone installation is convenient if you have <acronym>ODBC</acronym>
  193. client applications on multiple, heterogeneous platforms. The integrated
  194. installation is convenient when the target client is the same as the
  195. server, or when the client and server have similar runtime configurations.
  196. </Para>
  197. <para>
  198. Specifically if you have received the <productname>psqlODBC</productname>
  199.  driver as part of the <productname>Postgres</productname> distribution
  200.  (from now on referred to as an "integrated" build) then you will
  201. configure and make the <acronym>ODBC</acronym> driver
  202.  from the top level source directory
  203. of the <productname>Postgres</productname> distribution
  204.  along with the rest of its libraries.
  205. If you received the driver as a standalone package than you will run
  206. configure and make from the directory in which you unpacked the
  207. driver source.
  208. </Para>
  209. <procedure>
  210. <title>Integrated Installation</title>
  211. <para>
  212. This installation procedure is appropriate for an integrated installation.
  213. </Para>
  214. <step performance="required">
  215. <para>
  216. Specify the <option>--with-odbc</option>
  217. command-line argument for <application>src/configure</application>:
  218. <programlisting>
  219. % ./configure --with-odbc
  220. % make
  221. </programlisting>
  222. </Para>
  223. </step>
  224. <step performance="required">
  225. <para>
  226. Rebuild the <productname>Postgres</productname> distribution:
  227. <programlisting>
  228. % make install
  229. </programlisting>
  230. </Para>
  231. </step>
  232. </procedure>
  233. <para>
  234. Once configured, the <acronym>ODBC</acronym> driver will be built and installed
  235. into the areas defined for the other components of the
  236. <productname>Postgres</productname> system. The installation-wide
  237. <acronym>ODBC</acronym> configuration file will be placed into
  238. the top directory of the Postgres target tree (<envar>POSTGRESDIR</envar>).
  239. This can be overridden from the <application>make</application> command-line
  240. as
  241. <programlisting>
  242. % make ODBCINST=<replaceable>filename</replaceable> install
  243. </programlisting>
  244. </Para>
  245. <procedure>
  246. <title>Pre-v6.4 Integrated Installation</title>
  247. <para>
  248. If you have a <productname>Postgres</productname> installation older than
  249. v6.4, you have the original source tree available, 
  250. and you want to use the newest version of the <acronym>ODBC</acronym>
  251. driver, then you may want to try this form of installation.
  252. </Para>
  253. <step performance="required">
  254. <para>
  255. Copy the output tar file to your target system and unpack it into a 
  256. clean directory.
  257. </Para>
  258. </step>
  259. <step performance="required">
  260. <para>
  261. From the directory containing the
  262. sources, type:
  263. <programlisting>
  264. % ./configure
  265. % make
  266. % make POSTGRESDIR=<replaceable class="parameter">PostgresTopDir</replaceable> install
  267. </programlisting>
  268. </Para>
  269. </step>
  270. <step performance="optional">
  271. <para>
  272. If you would like to install components into different trees, 
  273. then you can specify various destinations explicitly:
  274. <programlisting>
  275. % make BINDIR=bindir  LIBDIR=libdir  HEADERDIR=headerdir ODBCINST=instfile install
  276. </programlisting>
  277. </Para>
  278. </step>
  279. </procedure>
  280. <procedure>
  281. <title>Standalone Installation</title>
  282. <para>
  283. A standalone installation is not integrated with or built on the normal
  284. <productname>Postgres</productname> distribution. It should be best suited
  285. for building the <acronym>ODBC</acronym> driver for multiple, heterogeneous
  286. clients who do not have a locally-installed <productname>Postgres</productname>
  287. source tree.
  288. </Para>
  289. <para>
  290. The default location for libraries and headers 
  291. for the standalone installation is <filename>/usr/local/lib</filename>
  292.  and <filename>/usr/local/include/iodbc</filename>, respectively.
  293. There is another system wide configuration file that gets installed
  294. as <filename>/share/odbcinst.ini</filename> (if <filename>/share</filename>
  295.  exists) or as <filename>/etc/odbcinst.ini</filename>
  296.  (if <filename>/share</filename> does not exist).
  297. </Para>
  298. <note>
  299. <para>
  300. Installation of files into <filename>/share</filename>
  301.  or <filename>/etc</filename> requires system root privileges.
  302. Most installation steps for <productname>Postgres</productname> do not
  303. have this requirement, and you can choose another destination which
  304. is writable by your non-root <productname>Postgres</productname> superuser
  305. account instead.
  306. </Para>
  307. </note>
  308. <step performance="required">
  309. <para>
  310. The standalone installation distribution can be built from the
  311. <productname>Postgres</productname> distribution or may be obtained from 
  312. <ulink url="http://www.insightdist.com/psqlodbc">Insight Distributors</ulink>,
  313. the current maintainers of the non-Unix sources.
  314. </Para>
  315. <para>
  316. Copy the zip
  317. or gzipped tarfile to an empty directory. If using the zip package
  318. unzip it with the command 
  319. <programlisting>
  320. % unzip -a <replaceable>packagename</replaceable>
  321. </programlisting>
  322. The <option>-a</option> option
  323. is necessary to get rid of <acronym>DOS</acronym> 
  324. CR/LF pairs in the source files.
  325. </Para>
  326. <para>
  327. If you have the gzipped tar package than simply run
  328. <programlisting>
  329. tar -xzf <replaceable>packagename</replaceable>
  330. </programlisting>
  331. </Para>
  332. <substeps>
  333. <step performance="optional">
  334. <para>
  335. To create a tar file for a complete standalone installation
  336. from the main <productname>Postgres</productname> source tree:
  337. </Para>
  338. </step>
  339. </substeps>
  340. </step>
  341. <step performance="required">
  342. <para>
  343. Configure the main <productname>Postgres</productname> distribution.
  344. </Para>
  345. </step>
  346. <step performance="required">
  347. <para>
  348. Create the tar file:
  349. <programlisting>
  350. % cd interfaces/odbc
  351. % make standalone
  352. </programlisting>
  353. </Para>
  354. </step>
  355. <step performance="required">
  356. <para>
  357. Copy the output tar file to your target system. Be sure to transfer as
  358. a binary file if using <application>ftp</application>.
  359. </Para>
  360. </step>
  361. <step performance="required">
  362. <para>
  363. Unpack the tar file into a clean
  364. directory.
  365. </Para>
  366. </step>
  367. <step performance="required">
  368. <para>
  369. Configure the standalone installation:
  370. <programlisting>
  371. % ./configure
  372. </programlisting>
  373. </Para>
  374. <para>
  375. The configuration can be done with options:
  376. <programlisting>
  377. % ./configure --prefix=<replaceable>rootdir</replaceable> --with-odbc=<replaceable>inidir</replaceable>
  378. </programlisting>
  379. where <option>--prefix</option> installs the libraries and headers in
  380. the directories <filename><replaceable>rootdir</replaceable>/lib</filename> and
  381. <filename><replaceable>rootdir</replaceable>/include/iodbc</filename>, and
  382. <option>--with-odbc</option> installs <filename>odbcinst.ini</filename> in the
  383. specified directory.
  384. </Para>
  385. <para>
  386. Note that both of these options can also be used from the integrated build
  387. but be aware that <emphasis>when used in the integrated build</emphasis>
  388. <option>--prefix</option> will also apply to the rest of
  389. your <productname>Postgres</productname> installation.
  390. <option>--with-odbc</option> applies only to the configuration file
  391.  <filename>odbcinst.ini</filename>.
  392. </Para>
  393. </step>
  394. <step performance="required">
  395. <para>
  396. Compile and link the source code:
  397. <programlisting>
  398. % make ODBCINST=<replaceable>instdir</replaceable>
  399. </programlisting>
  400. </Para>
  401. <para>
  402. You can also override the default location for installation on the
  403. 'make' command line. This only applies to the installation of the
  404. library and header files. Since the driver needs to know the location
  405. of the odbcinst.ini file attempting to override the enviroment variable
  406. that specifies its installation directory will probably cause you
  407. headaches. It is safest simply to allow the driver to install the
  408. odbcinst.ini file in the default directory or the directory you specified
  409. on the './configure' command line with --with-odbc.
  410. </Para>
  411. </step>
  412. <!--
  413. This doesn't currently work - thomas 1998-10-19
  414. <tip>
  415. <para>
  416. <envar>ODBCINST</envar> can be specified during configuration or during
  417. the compilation. It is not necessary to do so in both steps.
  418. </tip>
  419. -->
  420. <step performance="required">
  421. <para>
  422. Install the source code:
  423. <programlisting>
  424. % make POSTGRESDIR=<replaceable>targettree</replaceable> install
  425. </programlisting>
  426. </Para>
  427. <para>
  428. To override the library and header installation directories separately
  429. you need to pass the correct installation variables on the
  430. <literal>make install</literal> command line. These variables are
  431. <envar>LIBDIR</envar>, <envar>HEADERDIR</envar>
  432.  and <envar>ODBCINST</envar>.
  433. Overriding <envar>POSTGRESDIR</envar> on the make command line will cause
  434.  <envar>LIBDIR</envar> and <envar>HEADERDIR</envar>
  435.  to be rooted at the new directory you specify. 
  436. <envar>ODBCINST</envar> is independent of <envar>POSTGRESDIR</envar>.
  437. </Para>
  438. <para>
  439. Here is how you would specify the various destinations explicitly:
  440. <programlisting>
  441. % make BINDIR=<replaceable>bindir</replaceable> LIBDIR=<replaceable>libdir</replaceable> HEADERDIR=<replaceable>headerdir</replaceable> install
  442. </programlisting>
  443. </Para>
  444. <para>
  445. For example, typing
  446. <programlisting>
  447. % make POSTGRESDIR=/opt/psqlodbc install
  448. </programlisting>
  449. (after you've used
  450.  <application>./configure</application> and <application>make</application>)
  451. will cause the libraries and headers to be installed in the directories
  452. <filename>/opt/psqlodbc/lib</filename>
  453.  and <filename>/opt/psqlodbc/include/iodbc</filename> respectively.
  454. </Para>
  455. <para>
  456. The command
  457. <programlisting>
  458. % make POSTGRESDIR=/opt/psqlodbc HEADERDIR=/usr/local install
  459. </programlisting>
  460. should cause the libraries to be installed in /opt/psqlodbc/lib and
  461. the headers in /usr/local/include/iodbc. If this doesn't work as
  462. expected please contact one of the maintainers.
  463. </Para>
  464. </step>
  465. </procedure>
  466. </sect2>
  467. </sect1>
  468. <sect1>
  469. <title>Configuration Files</title>
  470. <para>
  471. <filename>~/.odbc.ini</filename> contains user-specified access information 
  472. for the <productname>psqlODBC</productname> driver. 
  473. The file uses conventions typical for <productname>Windows</productname> 
  474. Registry files, but despite this restriction can be made to work.
  475. </Para>
  476. <para>
  477. The <filename>.odbc.ini</filename> file has three required sections. 
  478. The first is <literal>[ODBC Data Sources]</literal>
  479. which is a list of arbitrary names and descriptions for each database 
  480. you wish to access. The second required section is the 
  481. Data Source Specification and there will be one of these sections
  482. for each database. 
  483. Each section must be labeled with the name given in 
  484. <literal>[ODBC Data Sources]</literal> and must contain the following entries: 
  485. <programlisting>
  486. Driver = <replaceable>POSTGRESDIR</replaceable>/lib/libpsqlodbc.so
  487. Database=<replaceable>DatabaseName</replaceable>
  488. Servername=localhost
  489. Port=5432
  490. </programlisting>
  491. <tip>
  492. <para>
  493. Remember that the <productname>Postgres</productname> database name is
  494. usually a single word, without path names of any sort. 
  495. The <productname>Postgres</productname> server manages the actual access
  496. to the database, and you need only specify the name from the client.
  497. </Para>
  498. </tip>
  499. Other entries may be inserted to control the format of the display. 
  500. The third required section is <literal>[ODBC]</literal> 
  501. which must contain the <literal>InstallDir</literal> keyword 
  502. and which may contain other options.
  503. </Para>
  504. <para>
  505. Here is an example <filename>.odbc.ini</filename> file, 
  506. showing access information for three databases:
  507. <programlisting>
  508. [ODBC Data Sources]
  509. DataEntry = Read/Write Database
  510. QueryOnly = Read-only Database
  511. Test = Debugging Database
  512. Default = Postgres Stripped
  513. [DataEntry]
  514. ReadOnly = 0
  515. Servername = localhost
  516. Database = Sales
  517. [QueryOnly]
  518. ReadOnly = 1
  519. Servername = localhost
  520. Database = Sales
  521. [Test]
  522. Debug = 1
  523. CommLog = 1
  524. ReadOnly = 0
  525. Servername = localhost
  526. Username = tgl
  527. Password = "no$way"
  528. Port = 5432
  529. Database = test
  530. [Default]
  531. Servername = localhost
  532. Database = tgl
  533. Driver = /opt/postgres/current/lib/libpsqlodbc.so
  534. [ODBC]
  535. InstallDir = /opt/applix/axdata/axshlib
  536. </programlisting>
  537. </Para>
  538. </sect1>
  539. <sect1>
  540. <title>ApplixWare</title>
  541. <sect2>
  542. <title>Configuration</title>
  543. <para>
  544. <productname>ApplixWare</productname> must be configured correctly
  545.  in order for it to
  546. be able to access the <productname>Postgres</productname>
  547.  <acronym>ODBC</acronym> software drivers.
  548. </Para>
  549. <procedure>
  550. <title>Enabling ApplixWare Database Access</title>
  551. <para>
  552. These instructions are for the 4.4.1 release of
  553.  <productname>ApplixWare</productname> on <productname>Linux</productname>.
  554. Refer to the <citetitle>Linux Sys Admin</citetitle> on-line book
  555.  for more detailed information.
  556. </Para>
  557. <step performance="required">
  558. <para>
  559. You must modify <filename>axnet.cnf</filename> so that
  560.  <filename>elfodbc</filename> can
  561. find <filename>libodbc.so</filename>
  562.  (the <acronym>ODBC</acronym> driver manager) shared library.
  563. This library is included with the ApplixWare distribution,
  564. but <filename>axnet.cnf</filename> needs to be modified to point to the 
  565. correct location.
  566. </Para>
  567. <para>
  568. As root, edit the file
  569. <filename><replaceable>applixroot</replaceable>/applix/axdata/axnet.cnf</filename>.
  570. </Para>
  571. <substeps>
  572. <step performance="required">
  573. <para>
  574. At the bottom of <filename>axnet.cnf</filename>,
  575. find the line that starts with
  576. <programlisting>
  577. #libFor elfodbc /ax/<replaceable>...</replaceable>
  578. </programlisting>
  579. </Para>
  580. </step>
  581. <step performance="required">
  582. <para>
  583. Change line to read
  584. <programlisting>
  585. libFor elfodbc <replaceable>applixroot</replaceable>/applix/axdata/axshlib/lib
  586. </programlisting>
  587. which will tell elfodbc to look in this directory
  588. for the <acronym>ODBC</acronym> support library.
  589. If you have installed applix somewhere else,
  590. change the path accordingly.
  591. </Para>
  592. </step>
  593. </substeps>
  594. </step>
  595. <step performance="required">
  596. <para>
  597. Create <filename>.odbc.ini</filename> as 
  598. described above.  You may also want to add the flag
  599. <programlisting>
  600. TextAsLongVarchar=0
  601. </programlisting>
  602. to the database-specific portion of <filename>.odbc.ini</filename>
  603. so that text fields will not be shown as <literal>**BLOB**</literal>.
  604. </Para>
  605. </step>
  606. </procedure>
  607. <procedure>
  608. <title>Testing ApplixWare ODBC Connections</title>
  609. <step performance="required">
  610. <para>
  611.     Bring up <application>Applix Data</application>
  612. </Para>
  613. </step>
  614. <step performance="required">
  615. <para>
  616. Select the <productname>Postgres</productname> database of interest.
  617. </Para>
  618. <substeps>
  619. <step performance="required">
  620. <para>
  621. Select <command>Query->Choose Server</command>.  
  622. </Para>
  623. </step>
  624. <step performance="required">
  625. <para>
  626.  Select <acronym>ODBC</acronym>, and click <command>Browse</command>.
  627. The database you configured in <filename>.odbc.ini</filename>
  628.     should be shown.  Make sure that the <option>Host: field</option>
  629.  is empty (if it is not, axnet will try to contact axnet on another machine
  630.  to look for the database).
  631. </Para>
  632. </step>
  633. <step performance="required">
  634. <para>
  635. Select the database in the box that was launched by <command>Browse</command>,
  636.  then click <command>OK</command>.
  637. </Para>
  638. </step>
  639. <step performance="required">
  640. <para>
  641. Enter username and password in the login identification dialog,
  642.  and click <command>OK</command>.
  643. </Para>
  644. </step>
  645. </substeps>
  646. <para>
  647.     You should see <quote>Starting elfodbc server</quote>
  648.  in the lower left corner of the
  649.     data window.  If you get an error dialog box, see the debugging section
  650.     below.
  651. </Para>
  652. </step>
  653. <step performance="required">
  654. <para>
  655.     The 'Ready' message will appear in the lower left corner of the data
  656.     window.  This indicates that you can now enter queries.
  657. </Para>
  658. </step>
  659. <step performance="required">
  660. <para>
  661.     Select a table from Query->Choose tables, and then select Query->Query
  662.     to access the database.  The first 50 or so rows from the table should
  663.     appear.
  664. </Para>
  665. </step>
  666. </procedure>
  667. </sect2>
  668. <sect2>
  669. <title>Common Problems</title>
  670. <para>
  671. The following messages can appear while trying to make an
  672. <acronym>ODBC</acronym> connection through 
  673. <productname>Applix Data</productname>:
  674. <variablelist>
  675. <varlistentry>
  676. <term>
  677. Cannot launch gateway on server
  678. </term>
  679. <listitem>
  680. <para>
  681. <literal>elfodbc</literal> can't find <filename>libodbc.so</filename>.  
  682. Check your <filename>axnet.cnf</filename>.
  683. </Para>
  684. </listitem>
  685. </varlistentry>
  686. <varlistentry>
  687. <term>
  688. Error from ODBC Gateway:
  689. IM003::[iODBC][Driver Manager]Specified driver could not be loaded
  690. </term>
  691. <listitem>
  692. <para>
  693. <filename>libodbc.so</filename> cannot find the driver listed in
  694. <filename>.odbc.ini</filename>. Verify the settings.
  695. </Para>
  696. </listitem>
  697. </varlistentry>
  698. <varlistentry>
  699. <term>
  700. Server: Broken Pipe
  701. </term>
  702. <listitem>
  703. <para>
  704.  The driver process has terminated due to some other
  705.  problem.  You might not have an up-to-date version
  706.  of the <productname>Postgres</productname>
  707. <acronym>ODBC</acronym> package.
  708. </Para>
  709. </listitem>
  710. </varlistentry>
  711. <varlistentry>
  712. <term>
  713. setuid to 256: failed to launch gateway
  714. </term>
  715. <listitem>
  716. <para>
  717. The September release of ApplixWare v4.4.1 (the first release with official
  718. <acronym>ODBC</acronym> support under Linux) shows problems when usernames
  719. exceed eight (8) characters in length.
  720. Problem description ontributed by 
  721. <ulink url="mailto:scampbell@lear.com">Steve Campbell</ulink>.
  722. </Para>
  723. </listitem>
  724. </varlistentry>
  725. </variablelist>
  726. </para>
  727. <para>
  728. <note>
  729. <title>Author</title>
  730. <para>
  731. Contributed by 
  732. <ulink url="mailto:scampbell@lear.com">Steve Campbell</ulink> on
  733. 1998-10-20.
  734. </para>
  735. </note>
  736. The <application>axnet</application> program's security system
  737.  seems a little suspect. <application>axnet</application> does things
  738.  on behalf of the user and on a true
  739.  multiple user system it really should be run with root security 
  740. (so it can read/write in each user's directory).  
  741. I would hesitate to recommend this, however, since we have no idea what 
  742. security holes this creates.
  743. </para>
  744. </sect2>
  745. <sect2>
  746. <title>Debugging ApplixWare ODBC Connections</title>
  747. <para>
  748. One good tool for debugging connection problems uses the Unix system
  749. utility <application>strace</application>.
  750. </para>
  751. <procedure>
  752. <title>Debugging with strace</title>
  753. <step performance="required">
  754. <para>
  755. Start applixware.
  756. </para>
  757. </step>
  758. <step performance="required">
  759. <para>
  760. Start an <application>strace</application> on
  761. the axnet process.  For example, if
  762. <programlisting>
  763. ps -aucx | grep ax 
  764. </programlisting>
  765. shows
  766. <programlisting>
  767. cary   10432  0.0  2.6  1740   392  ?  S  Oct  9  0:00 axnet
  768. cary   27883  0.9 31.0 12692  4596  ?  S   10:24  0:04 axmain
  769. </programlisting>
  770. </para>
  771. <para>
  772. Then run
  773. <programlisting>
  774.    strace -f -s 1024 -p 10432 
  775. </programlisting>
  776. </para>
  777. </step>
  778. <step performance="required">
  779. <para>
  780. Check the strace output.
  781. </para>
  782. <note>
  783. <title>Note from Cary</title>
  784. <para>
  785. Many of the error messages from <productname>ApplixWare</productname>
  786. go to <filename>stderr</filename>, 
  787. but I'm not sure where <filename>stderr</filename>
  788. is sent, so <application>strace</application> is the way to find out.
  789. </para>
  790. </note>
  791. </step>
  792. </procedure>
  793. <para>
  794.   For example, after getting
  795. a <quote>Cannot launch gateway on server</quote>, 
  796. I ran strace on axnet and got
  797. <programlisting>
  798. [pid 27947] open("/usr/lib/libodbc.so", O_RDONLY) = -1 ENOENT
  799.     (No such file or directory)
  800. [pid 27947] open("/lib/libodbc.so", O_RDONLY) = -1 ENOENT
  801.     (No such file or directory)
  802. [pid 27947] write(2, "/usr2/applix/axdata/elfodbc:
  803.     can't load library 'libodbc.so'n", 61) = -1 EIO (I/O error)
  804. </programlisting>  
  805. So what is happening is that applix elfodbc is searching for libodbc.so, but it
  806. can't find it.  That is why axnet.cnf needed to be changed.
  807. </para>
  808. </sect2>
  809. <sect2>
  810. <title>Running the ApplixWare Demo</title>
  811. <para>
  812. In order to go through the 
  813. <citetitle>ApplixWare Data Tutorial</citetitle>, you need to create
  814. the sample tables that the Tutorial refers to.  The ELF Macro used to
  815. create the tables tries to use a NULL condition 
  816. on many of the database columns,
  817. and <productname>Postgres</productname> does not currently allow this option.
  818. </para>
  819. <para>
  820. To get around this problem, you can do the following:
  821. </para>
  822. <procedure>
  823. <title>Modifying the ApplixWare Demo</title>
  824. <step performance="required">
  825. <para>
  826. Copy <filename>/opt/applix/axdata/eng/Demos/sqldemo.am</filename>
  827.  to a local directory.
  828. </para>
  829. </step>
  830. <step performance="required">
  831. <para>
  832. Edit this local copy of <filename>sqldemo.am</filename>:
  833. </para>
  834. <substeps>
  835. <step performance="required">
  836. <para>
  837. Search for 'null_clause = "NULL"
  838. </para>
  839. </step>
  840. <step performance="required">
  841. <para>
  842. Change this to null_clause = ""
  843. </para>
  844. </step>
  845. </substeps>
  846. </step>
  847. <step performance="required">
  848. <para>
  849. Start <application>Applix Macro Editor</application>.
  850. </para>
  851. </step>
  852. <step performance="required">
  853. <para>
  854. Open the sqldemo.am file from the <application>Macro Editor</application>.
  855. </para>
  856. </step>
  857. <step performance="required">
  858. <para>
  859. Select <command>File->Compile and Save</command>.
  860. </para>
  861. </step>
  862. <step performance="required">
  863. <para>
  864. Exit <application>Macro Editor</application>.
  865. </para>
  866. </step>
  867. <step performance="required">
  868. <para>
  869. Start <application>Applix Data</application>.
  870. </para>
  871. </step>
  872. <step performance="required">
  873. <para>
  874. Select <command>*->Run Macro</command>
  875. </para>
  876. </step>
  877. <step performance="required">
  878. <para>
  879. Enter the value <quote>sqldemo</quote>, then click <command>OK</command>.
  880. </para>
  881. <para>
  882. You should see the progress in the status line of the data window
  883.  (in the lower left corner).
  884. </para>
  885. </step>
  886. <step performance="required">
  887. <para>
  888. You should now be able to access the demo tables.
  889. </para>
  890. </step>
  891. </procedure>
  892. </sect2>
  893. <sect2>
  894. <title>Useful Macros</title>
  895. <para>
  896. You can add information about your
  897. database login and password to the standard Applix startup
  898. macro file. This is an example 
  899. <filename>~/axhome/macros/login.am</filename> file:
  900. <programlisting>
  901. macro login
  902.     set_set_system_var@("sql_username@","tgl")
  903.     set_system_var@("sql_passwd@","no$way")
  904. endmacro
  905. </programlisting>
  906. <caution>
  907. <para>
  908. You should be careful about the file protections on any file containing
  909. username and password information.
  910. </para>
  911. </caution>
  912. </para>
  913. </sect2>
  914. <sect2>
  915. <title>Supported Platforms</title>
  916. <para>
  917. <productname>psqlODBC</productname> has been built and tested
  918. on <productname>Linux</productname>. There have been reports of success
  919. with FreeBSD and with Solaris. There are no known restrictions
  920. on the basic code for other platforms which already support
  921. <productname>Postgres</productname>.
  922. </para>
  923. </sect2>
  924. </sect1>
  925. </Chapter>
  926. <!-- Keep this comment at the end of the file
  927. Local variables:
  928. mode: sgml
  929. sgml-omittag:t
  930. sgml-shorttag:t
  931. sgml-minimize-attributes:nil
  932. sgml-always-quote-attributes:t
  933. sgml-indent-step:1
  934. sgml-indent-data:t
  935. sgml-parent-document:nil
  936. sgml-default-dtd-file:"./reference.ced"
  937. sgml-exposed-tags:nil
  938. sgml-local-catalogs:"/usr/lib/sgml/CATALOG"
  939. sgml-local-ecat-files:nil
  940. End:
  941. -->