Developer Links
SUPPORT FORUMS  
SAMPLE CODE & TIDS  
TEST/DEVELOPMENT KIT INFO
 
DEVELOPER LABS  
NOVELL SUPERLAB  
SUPPORT DOCUMENTS  
STRATEGIC/EXECUTIVE ISSUE TRACKING  
SYSOP PROGRAM  
     
Related Links
 
 
 
 
 
Related Links  
 

 
DEVELOPER SUPPORT HOME  

JANUARY 1993 VOLUME 5 NUMBER 1


INDEX


MAD'S COLUMN

Hello and welcome to the January 1993 issue of Bullets!

In past issues, I have touched on planned enhancements for developer support and developer programs. An exciting new enhancement you will soon be seeing in documents like the Novell Developers Guide is the SDK Grading System.

What is this SDK Grading System, you ask? Quite often, I find a disparity between the implied maturity of an SDK and the needs of the developer community. The SDK Grading System is structured to eliminate the guesswork that is sometimes associated with SDKs.

Some developers don't want to see an SDK unless it has been completely unit- and system-tested, with documentation either nicely bound or stored on a CD, and for which education classes and telephone support are available. Other developers are interested in an SDK at a very early stage, when the APIs are still forming, documentation is a less formal collection of header files and developer notes, and support is not yet provided.

To produce the SDK Grading System, input (in the form of grades) is gathered from the various groups (Engineering, Documentation, Marketing, Education, Testing, Support, etc.). This input is then combined to determine an overall grade for each SDK. An SDK's "grade" may change over time. We hope that this process will help Novell's developers establish their expectations for SDKs.

Happy_Programming!

Mad Poarch
Director
Developer Support/Service


ARTICLES:

Getting Started with NetWare 4.0: Directory Services

With NetWare 4.0, Novell has introduced Directory Services to replace the traditional NetWare bindery employed by previous versions. NetWare 4.0 Directory Services provide many new features and capabilities. Directory Services functionality is provided through an extensive new Application Program Interface (API).

This article presents a basic introduction to NetWare 4.0 Directory Services and is not intended to replace a thorough study of the documentation. It discusses several of the new features and advantages of Directory Services and offers a few tips and some general information to help you begin writing Directory Services applications more quickly. Converting existing applications from the bindery to Directory Services is also discussed. This article also includes example code that creates a Directory Services User class object to provide a starting point for using the Directory Services API.

Advantages of Directory Services

NetWare 4.0 Directory Services provides a hierarchical database architecture to store network information. This architecture, combined with advanced techniques for retrieving and storing database information, provides a very flexible environment for application development.

One of the most beneficial Directory Services features is the network global scope of objects in the directory. An application with sufficient NetWare rights may retrieve information about any object in the directory without needing to be attached to any specific server. Access to a Directory Services object and its attribute information is limited solely by the access rights of the client, without regard to server connection status.

Another very useful feature that is built into the Directory Services API is that changes made to the directory database are atomic. When an application makes changes to the directory database, each change is completely defined before the change to this database is attempted. When the change is actually made to the database, if any part of the operation fails, the entire operation fails. This makes it virtually impossible for partially defined objects to exist in the directory.

With NetWare 4.0 Directory Services, no space is wasted in a directory database because no minimum size is defined for information describing objects and attributes. Objects are stored only once in the directory, reducing the overall size of the database.

The hierarchical database structure of Directory Services design reduces network traffic and makes retrieving objects and attributes very easy and efficient. You need not search the entire database tree to locate an object; searching may be performed at any level of the tree. Enhanced searching techniques allow objects to be located in a variety of ways, such as using relational expressions and wild cards. Also, objects in the directory do not advertise. Network traffic is generated only when an application asks the directory for information.

Finally, the entire NetWare 4.0 Directory Services Schema (the rules that define how the directory tree is constructed) may be modified and expanded by applications to suit specific needs. If the defined schema does not meet your needs, you may define an entirely new schema, or make modifications to parts of it. This feature adds greater flexibility to the NetWare 4.0 environment.

Developing Directory Services Applications

Developing Directory Services applications requires an understanding of concepts and ideas very different from the knowledge required to use the bindery. When you begin studying the manuals related to Directory Service applications, there are several things that you should keep in mind:
  • You do not need to understand everything about Directory Services to use the Directory Services API and begin writing applications.
  • Though writing directory applications may initially seem to be more complex than writing bindery applications, the directory is often easier to use.
  • Novell will continue to support all bindery APIs for some time, so you may continue to use bindery calls to perform operations until you are familiar with their directory equivalents. If you are already very familiar with the bindery, it may in some cases be easier to write a bindery application and then convert it to Directory Services.

Context & Buffer Management

Begin learning how to write applications for the directory by investigating the APIs for context and buffer management. Almost all Directory Services functions require a context handle and a buffer. The context handle provides information about the location in the directory of the object to be manipulated, while the buffer defines the operation that you want to perform. Creating a context handle may only be required once for the life of an application, but the creation and definition of buffers will probably be required for each individual operation performed in the directory. There are several APIs that you can use to manipulate contexts. NWDSCreateContext() and NWDSFreeContext() are the only two that you will need to begin writing applications. There are many APIs that create, manipulate, and free buffers. The functions NWDSAllocBuf(), NWDSInitBuf(), and NWDSFreeBuf() create and initialize buffers and are almost always required when performing directory operations. The NWDSPut...() and NWDSGet...() series of functions are used to store and retrieve information in the allocated buffers. You will use some arrangement of these calls to define the buffers which you will then use as parameters to other functions to perform directory operations. None of the buffering functions will change any information stored in the directory. These functions are used only to define the information required to perform operations. The directory database is not modified until a directory call is made.

Once you are familiar with contexts and buffers, start making directory calls. Stay away from the more complex operations at first (such as defining new attributes or classes, manipulating access control lists, and creating partitions). Begin with some of the more straightforward operations, such as creating new objects and reading attribute information from existing objects.

The functions NWDSAddObject(), NWDSRead(), NWDSSearch(), NWDSModifyObject(), and NWDSRemoveObject(), are sufficient to perform many useful directory operations while introducing you to the capabilities of the directory database.

NWDSRead() and NWDSSearch() perform similar operations: NWDSRead() is used to get information about an object when you know the object's name, while NWDSSearch() is used to scan the entire directory for object names and return information about them. Remember that all of these functions except NWDSRemoveObject() require that the buffer initialization and manipulation functions be used to define the buffers necessary to make the directory call. NWDSRemoveObject() requires only the name of the object to be removed.

Constant values (defined in the header file NWDSDEFS.H) are used in buffer management functions to specify which operation is desired. For example, the constant DSV_ADD_ENTRY is passed to NWDSInitBuf() to define a buffer to be used when adding a new object to the directory. NWDSAddObject() is called with the defined buffer to add the object. DSV_MODIFY_ENTRY would be passed to NWDSInitBuf() to define a buffer to be used to change an object's definition in the database. The actual change is performed by calling NWDSModifyObject() with the defined buffer.

If attribute values (similar to property values in the bindery) are to be defined, NWDSPutAttrName() and NWDSPutAttrVal() are required to place the attribute names and values in the buffers. Attribute values may be defined when an object is created, or they may be added to existing objects by using NWDSModifyObject().

To perform these types of operations, review the Directory Services Schema documentation to learn what attribute information is available with the various object classes. The User object class is a good place to begin, since it is a very common class and is used frequently by the NetWare 4.0 directory. In the directory, the User object class is analogous to the OT_USER bindery object type in the bindery, so this class is probably a familiar place to start.

Client & Server Considerations

There is very little distinction between the server and client environments when writing applications that use directory services. The only difference is that, when writing client applications, you must initialize the Unicode tables by calling the NWDSInitUnicodeTables() function before calling any Directory Services functions. The required Unicode files are provided with NetWare. Consult the documentation to determine where these files must be located to ensure that applications can find them during the initialization process.

The Directory Services header files use the constant value NLM to differentiate between server and client applications. You may also use this constant to compile conditionally for the two environments, making it unnecessary to have two versions of the source code.

Compilation in the two environments requires the use of several new header files that support the Directory Services APIs. For linking, there is a new import file for NLMs and there are new libraries for client applications. NLMs should include the DSAPI.IMP import file when linking, and client applications should include the NWNET.LIB, NWCALLS.LIB, and NWLOCALE.LIB libraries.

Converting Bindery-Based Apps to Directory Services

After becoming familiar with some of the basic Directory Services APIs, converting a bindery application to use Directory Services is fairly easy. Although there is no "one-to-one" correspondence between bindery and directory functions, the subset of directory functions that replace the functionality of the bindery is relatively small. When you learn to use the functions required to control and access objects and attributes in the directory, you understand the majority of the functions needed to convert a bindery-based application to run in the Directory Services environment.

Since the bindery functions will still be supported for some time, you do not need to convert your entire application to Directory Services at once. It is possible (and in some cases desirable) for applications to use a combination of directory and bindery functions. During the gradual transition from bindery networks to directory networks, your applications may even need to operate in both environments.

The most important part of the process of converting to the directory is determining which directory functions provide the greatest benefit to your application and implementing those functions first. You must then decide which bindery functions your application should continue to use in order to maintain backward compatibility with previous versions of NetWare. The two sets of functionality can exist in harmony, but you should upgrade all of your bindery functions to the directory as time permits, leaving only those bindery functions that your application requires to support previous versions of NetWare. Figure 1 below contains several examples of common bindery functions and directory functions that perform similar operations.

FIGURE 1: Common bindery functions and associated directory functions

Bindery Function              Directory Services Function
=============================================================
CreateBinderyObject()         NWDSAddObject()
-------------------------------------------------------------
DeleteBinderyObject()         NWDSRemoveObject()
-------------------------------------------------------------
ReadPropertyValue()           NWDSRead, NWDSSearch()
-------------------------------------------------------------
ScanBinderyObject()           NWDSRead, NWDSSearch()
-------------------------------------------------------------
ScanProperty()                NWDSRead, NWDSSearch()
-------------------------------------------------------------
WritePropertyValue()          NWDSModifyObject()
-------------------------------------------------------------

END of FIGURE 1
Several bindery functions are replaced by NWDSRead() and NWDSSearch(). This is made possible by the buffer management concept used by directory functions. The definition of the buffer controls how an operation will be performed in the directory. Then, after a buffer is correctly defined, making the directory function call to perform the operation is very straightforward. If an operation fails, it is most likely due to an incorrect buffer definition. This can usually be caught before the directory call is made by checking the return codes from the buffering functions, but this is not always the case.

The buffering functions themselves do not affect the directory database. The buffering functions check for proper syntax when creating the buffers, but they have no knowledge of what information exists in the directory. For example, if you define a buffer that includes attribute information, the buffering functions will check to ensure that the attribute names and values are specified in the proper format. However, if you misspell an attribute name, no error will occur until the directory call is actually made. If you get an error code from a directory function, correcting it will probably require changing one of the buffering function calls, not the directory call.

Example Code

The example code in Figure 2 below illustrates one of the most common directory service operations: creating a new directory object of the User class.

FIGURE 2: Creating a new "User" directory object

#define  LOGIN_NAME     "Admin"
#define  PASSWORD       ""
#define  OBJECT_NAME    "Example User Object"
#define  SURNAME        "Example Surname"

#define  ESUCCESS       0

#include 
#include 

#include 

NWDSContextHandle Context;

int ExampleCreateDSObject( char *objectName, char *surName )
   {
   int ccode;
   int32 interationHandle;
   Buf_T *attributes;

   ccode = NWDSAllocBuf(DEFAULT_MESSAGE_LEN, &attributes);
   if(ccode < ESUCCESS)
      return ccode;

   ccode = NWDSInitBuf(Context, DSV_ADD_ENTRY, attributes);
   if(ccode < ESUCCESS)
      goto freeBuffers;

   ccode = NWDSPutAttrName(Context, attributes, A_OBJECT_CLASS);
   if(ccode < ESUCCESS)
      goto freeBuffers;
   ccode = NWDSPutAttrVal(Context, attributes,
                          SYN_CLASS_NAME, A_USER);
   if(ccode < ESUCCESS)
      goto freeBuffers;

   ccode = NWDSPutAttrName(Context, attributes, A_SURNAME);
   if(ccode < ESUCCESS)
      goto freeBuffers;
   ccode = NWDSPutAttrVal(Context, attributes,
                          SYN_CI_STRING, surName);
   if(ccode < ESUCCESS)
      goto freeBuffers;


   interationHandle = NO_MORE_ITERATIONS;
   ccode = NWDSAddObject(Context, objectName, &interationHandle,
                         FALSE, attributes);

freeBuffers:
   NWDSFreeBuf(attributes);
   return ccode;
   }

void main( void )
   {
   int ccode;

#ifndef NLM
   ccode = NWInitUnicodeTables(001, 437);
   if(ccode < ESUCCESS)
      {
      printf("NWDSInitUnicodeTables returned %d\n", ccode);
      exit(1);
      }
#endif

   Context = NWDSCreateContext();
   if((long)Context < ESUCCESS)
      {
      printf("NWDSCreateContext returned %d\n", (int)Context);
      exit(1);
      }

   ccode = NWDSLogin(Context, 0, LOGIN_NAME, PASSWORD, 0);
   if(ccode)
      {
      NWDSFreeContext(Context);
      printf("NWDSLogin returned %d\n", ccode);
      exit(1);
      }

   ccode = ExampleCreateDSObject(OBJECT_NAME, SURNAME);
   printf("AddNWDSObject returned %d\n", ccode);

   NWDSLogout(Context);
   NWDSFreeContext(Context);
   }

END of FIGURE 2
The mainline performs several operations that are required in most directory applications:
  • Initializing the Unicode tables,
  • Creating a context,
  • Logging in, and
  • Freeing all of these resources after the directory operations are complete.
Notice that the "#ifndef" operator is used for conditional compilation of the NWDSInitUnicodeTables() function call. The example code creates a global context handle that is used throughout the rest of the program. A login is necessary (using NWDSLogin()) to obtain the required access rights for creating objects. Some functions (e.g., functions that read and search directory information) do not require the application to be logged in to the directory, since some objects allow access to read their attributes with no restrictions. For example, no login is required to read the Network Address attribute of a server when the name of the server object is known.

ExampleCreateDSObject() provides examples of buffer creation and initialization. Buffer manipulation functions put into the buffer the information required to define the object to be created. The buffer is initialized with the DSV_ADD_ENTRY constant, since a new object is being added. The only attribute information that must be placed in the buffer is for the mandatory attributes Object Class and Surname. The Common Name is also a mandatory attribute, but this name is supplied as one of the parameters (objectName) to NWDSAddObject().

The NWDSAddObject() call uses the information defined in the buffer to add the object to the directory database. Remember that if any part of the add operation fails (for example, if one of the attribute names is undefined), the entire operation will fail and the object will not be created.

As you make changes to the directory database, you will begin to notice a pattern of function calls that is repeated for most operations. The table in Figure 3 lists the basic steps required to accomplish most directory database operations and each operation's corresponding functions.

FIGURE 3: Steps required for directory database operations & each operation's corresponding function calls

Operation                          Directory Function Call
=============================================================
Initialize the Unicode tables      NWDSInitUnicodeTables()
(client applications only)
-------------------------------------------------------------
Create context                     NWDSCreateContext()
-------------------------------------------------------------
Login                              NWDSLogin()
-------------------------------------------------------------
Allocate buffers                   NWDSAllocBuf()
-------------------------------------------------------------
Initialize buffers                 NWDSInitBuf()
-------------------------------------------------------------
Define buffers                     NWDSPut...()
-------------------------------------------------------------
Perform the Directory Operation    NWDSAddObject()
                                   NWDSModifyObject()
                                   ...
-------------------------------------------------------------
Retrieve buffer information        NWDSGet...()
-------------------------------------------------------------
Free buffers                       NWDSFreeBuf()
-------------------------------------------------------------
Logout                             NWDSLogout()
-------------------------------------------------------------
Free context                       NWDSFreeContext()
-------------------------------------------------------------

END of FIGURE 3
These steps are not absolute; depending on the operation, more, fewer, or different steps may be required. This is just a general outline you can use as a starting point.

NetWare 4.0 Directory Services offers new features and advantages that make developing in a network environment easier and more flexible. Writing applications that take advantage of the directory requires careful planning, but the advantages are well worth the effort. Converting existing bindery-based applications to Directory Services gives applications greater flexibility, especially while hybrid bindery-and-directory networks exist that allow applications to be converted to the directory in stages. Once you are familiar with the directory, you will find that the capabilities provided by NetWare 4.0 Directory Services make NetWare applications development an even more rewarding and profitable endeavor.

You can gain access to the Directory Services API through the NLM SDK for NetWare 4.0 and the NetWare Client SDK. You must be a member of a Novell Developers' Program to purchase these SDKs. For more information on these SDKs and the Novell Professional Developers' Program, call 1-800-NETWARE or 1-801-429-5588 (in the U.S. and Canada), or contact your local international Novell office.


TECHNICAL INSIGHTS:

Creating Btrieve Quick Libraries for Visual Basic for DOS (Btrieve (all versions))

When developing Btrieve applications using the Microsoft Visual Basic for DOS interpreter environment (VBDOS), you must create a Quick Library that includes the required Btrieve interface. To create this Quick Library, use the following link command:
Link /q BC7RBTRV.OBJ, BC7.QLB,, VBDOSQLB.LIB;
where BC7RBTRV.OBJ is the Btrieve interface, BC7.QLB is the name of the Quick Library, and VBDOSQLB.LIB is the name of the required library. To load the Visual Basic for DOS environment to include the newly created Quick Library execute the following command:
VBDOS /L BC7

Header File Inconsistencies (NetWare C Interface for DOS v1.2)

In DIAG.H, the fields, linkAddress and ESRAddress, in the ECB structure are defined as an array of WORD. In NXT.H, linkAddress and ESRAddress are defined as far pointers. These inconsistent ECB structure definitions can cause some problems if an ESR is defined in your application and the include file DIAG.H exists before NXT.H.

To resolve this inconsistency, either avoid including DIAG.H before NXT.H in applications that make IPX calls, or modify the linkAddress and ESRAddress fields in DIAG.H as follows:

void far  *linkAddress;
void (far *) ();
The above definition should be included for applications that do not use ESR routines.

Borland's Default open() Mode (NetWare C Interface for DOS v1.2)

After writing to a file through the Queue Services API, extra 0x0D (Carriage Return) characters may be left in the file. These extra characters remain because the Queue Services API assumes that the file will be open in Binary mode. For example, in the SERVJOB.C module, open() is called without specifying the mode in which the file should be open. If Borland's C++ v3.1 compiler is used to open the file, it defaults to text filtering which causes some extra characters to appear in the file.

To prevent the introduction of these extra 0x0D characters, change Borland's default open() mode by including the following lines in your code:

extern int _fmode;

_fmode = O_BINARY;

New Status Codes for NetWare SQL v3.0 (NetWare SQL v3.0)

Several status codes have been added to NetWare SQL since the release of version 3.0. These status codes are not documented in NetWare SQL Status Codes and Messages (Jan. 1992 ed.).
350  Security is not enabled on dictionary
You have attempted to perform an operation that can only be done when security is enabled. Database security is not enabled at this time.
351  Transaction is not started yet
You must start a transaction before performing a COMMIT or ROLLBACK operation.
886  Incorrect Btrieve file version for this operation
Referential integrity constraints can only be defined on Btrieve file versions 6.0 or later. If you wish to add referential integrity to this file, use BREBUILD to convert it to the v6.0 file format.
887  CREATE TABLE statement cannot reference the same table more than once
This status code is returned in place of 568; status code 568 is not actually used. For more details, check the NetWare SQL Status Codes and Messages manual under "status code 568."
888  A primary key is already defined on this table
A table may contain only one primary key and you have attempted to define a second primary key on this table.

Must Scan Salvagable Files Before Purging (NetWare C Interface for DOS v1.2)

The NetWare C Interface for DOS v1.2 documentation incorrectly states that an initial search can be performed by setting entryID to "-1." Setting the entryID parameter in PurgeSalvagableFile() to "-1" as suggested in the documentation always causes it to fail. PurgeSalvagableFile() cannot scan for files to be purged.

You must call ScanSalvagableFiles() to get a valid entryID value before calling PurgeSalvagableFile(). This entryID will allow PurgeSalvagableFile() to identify the directory entry to be purged.

readdir API Returns Invalid Date/Time (Network C for NLMs v2.0(d))

The readdir API is returning date/time fields in a format that is similar to the DOS date/time format, but not identical. Differences between the formats cause SetFileInfo() to set the time and date information incorrectly if the fields are passed directly from readdir().

The documentation states that dates should be stored in DOS format for SetFileInfo(). However, to accomplish this, the dates/times returned from readdir() must be modified. The four-byte date/time value must have the two WORDs, "AA BB" and "CC DD," swapped, but the WORDs themselves should not be swapped. For example,

AA BB CC DD
needs to be stored as
CC DD AA BB
Simply using LongSwap does not resolve this situation, since LongSwap also swaps the values within the WORDS as well. To ensure that date/ time values are set properly, swap only the location of the two WORD values. Figure 4 contains an example that assumes the receiving fields have been defined as character arrays.

FIGURE 4: Example of Date/Time format change

*(WORD *)lastUpdateDateAndTime      = dirP->d_date;
*(WORD *)&lastUpdateDateAndTime[2]  = dirP->d_time;

*(WORD *)creationDateAndTime        = ((WORD *)(&dirP->d_cdatetime))[1];
*(WORD *)&creationDateAndTime[2]    = ((WORD *)(&dirP->d_cdatetime))[0];

*(WORD *)lastAccessDate             = ((WORD *)(&dirP->d_adatetime))[1];

*(WORD *)lastArchiveDateAndTime     = ((WORD *)(&dirP->d_bdatetime))[1];
*(WORD *)&lastArchiveDateAndTime[2] = ((WORD *)(&dirP->d_bdatetime))[0];

END of FIGURE 4

Printing Through Xtrieve PLUS - Tabloid Setting Correction (Xtrieve PLUS v4.11)

In the XTRIEVE.PDB file that ships with NetWare SQL v3.0, the TABLOID setting is set to EPSON LQ-1500/2.0, rather than IBM PC Graphics printer. To change the TABLOID setting to IBM PC Graphics printer, the printer information needs to be altered as follows:
  • At the DOS prompt type
    "SLATE XTRIEVE.PDB"
    
  • Select "Add/Edit Devices (Ptr Connections)" - Select "3001 Tabloid"
    - Tab to "Ptr Mfg"
    - Press F9 [Lists]
    - Select "IBM"
    - Tab to "Ptr Type"
    - Press F9 [Lists]
    - Select "PC Graphics Printer"
  • Press F10 [Prev Screen]
    Press F10 [Prev Screen]
    Press F10 [Exit]

MapDrive() and Windows (NetWare C Interface for Windows v1.3)

The Windows MapDrive() function can only modify an existing search drive, it cannot add a new one. In order to add a search drive under Windows, a dummy search drive is required before bringing up Windows. Then, this search mapping can be modified using MapDrive().

Get Next Extended Operation after Get Key (NetWare Btrieve v5.15, Btrieve for DOS v5.10a)

If you use the GetKey bias (+50) when establishing positioning before a Get Next Extended (38) operation, the extended operation will not function properly, returning either a status 19 (Unrecoverable Error) or erroneous information in the databuffer. This situation occurs with Btrieve for DOS v5.10a and NetWare Btrieve v5.15.

Patch #57, available on Novell's NetWire forum on CompuServe (NOVLIB, LIB 7), resolves the situation for NetWare Btrieve v5.15. There is currently no patch for Btrieve for DOS v5.10a, so avoid using the GetKey bias before Get Next Extended operations. Instead, use a Get First (12), Get Equal (5), or some other operation to establish positioning without the +50 bias.

NetWare Btrieve & New Intel NE3200 Driver (NetWare Btrieve (NLM) v5.15)

File corruption can occur when you use Intel's NE3200.COM driver (09-03-91, 19242 bytes) in conjunction with Intel's EtherExpress 32bit card on workstations running Btrieve applications. Intel describes the situation as:

"... a problem with the Ether-Express 32 and applications that use extended memory or memory managers (i.e. MicroSoft Windows 3.x). Previous versions of this driver would not protect memory regions from the above mentioned applications. This could cause files that the EtherExpress 32 stored in memory to be overwritten (corrupted) if an application wrote to that address space."

Intel has a new NE3200.COM driver (date: 05-04-92, size: 25967) which fixes these problems through the use of the keyword "DOUBLE BUFFER" in the NET.CFG file. This driver is still in Beta and has not completed certification. This driver defaults to an 802.2 frame type; if you need a different frame type, include a "FRAME" statement in the NET.CFG file. Figure 5 contains a sample NET.CFG file. Note that this file requires the NE3200.COM driver to be in the same directory as itself.

FIGURE 5: Sample NET.CFG file for NE3200.COM driver

LINK DRIVER NE3200
SLOT 5
DOUBLE BUFFER
FRAME ETHERNET_802.3
PROTOCOL IPX 0 ETHERNET_802.3
PROTOCOL IPX
BIND NE3200

END of FIGURE 5

Substitution Variables & NetWare SQL Inserts (NetWare SQL v3.0a)

When inserting records through a substitution variable, if the data being inserted contains the "@" character, all subsequent inserts with the same cursor are given the same data for that field. NetWare SQL is confusing the "@" in the data with a substitution variable indicator.

FIGURE 6: NetWare SQL inserts resulting in incorrect field data

XQLCompile of "INSERT INTO Patients (ID, First^Name, Last^Name, Address)
               VALUES (@V1, @V2, @V3, @V4)"
XQLSubst where
  V1 = "A11111"  V2 = "John"  V3 = "Smith"  V4 = "100 Main @ 1st"
XQLExec (performs Insert successfully)
XQLSubst where
  V1 = "B22222"  V2 = "Mary"  V3 = "Brown"  V4 = "222 Central Ave."
XQLExec (performs Insert successfully)

END of FIGURE 6
For example, in Figure 6, the second insert (and all subsequent inserts based on the same XQLCompile command) will result in each record being inserted with the same address as the first record: "100 Main @ 1st".

This occurs with any application making the above calls, and when using the Load option of the NetWare SQL Maintenance Utility (NSUTIL.EXE and NSUTIL.NLM), since it uses these calls. With NSUTIL, the problem will occur in each file format: SDF, UNF, DIF or ASC.

To resolve the situation and ensure that each record is inserted with the correct address, upgrade to the latest release of NetWare SQL, version 3.0b (avail. Dec. 92). To obtain v3.0b, download SQL30.ZIP form the NOVLIB forum on CompuServe, or contact Novell Developer Support (see "Contacting Novell," page 11). Otherwise, the only work-around is to recompile the statement between XQLSubst/XQLExec calls, or append the actual data values into the Insert statement passed in on the XQLCompile command, instead of using the substitution variables.

Unique Passwords (NetWare v3.11)

If the "Unique Passwords" requirement is enabled through SYSCON, and a password is changed to one of the old passwords through SYSCON, the password is accepted and no error messages are returned.

Whenever you change a password through SYSCON, the password expiration date defaults to January 1, 1985. Unless you change this expiration date to a date later than the current date, SYSCON will accept any passwords that were used previously even though the "Unique Passwords" restriction is on. Therefore, make sure that the password expiration date is valid.

Determining If Data Dictionary Files are Corrupted (Xtrieve PLUS v4.1x)

When you attempt to add fields to a view and when recalling views, if the .DDF files are damaged, Xtrieve PLUS v4.1x returns status 207 (Field Does Not Exist in Dictionary) or status 240 (Field in the View Definition Is Not in the Active Dictionary).

In the Xtrieve PLUS User's Manual (for DOS and OS2), Appendix D lists Dictionary Structures for all of the .DDF files. With Xtrieve PLUS for NetWare SQL, the Dictionary Structures are shown in Appendix C. Each description lists the field and index names for each .DDF file. Specifics are given for field data types and sizes, and key flags, such as duplicates, case sensitivity, and segments.

To view the .DDF file definitions in Xtrieve PLUS, the CONFIGURE/ SWITCHES/DICTIONARY option must be set to "Yes." Then, the .DDF file definitions can be viewed through the DICTIONARY/SHOW option. To resolve this situation, use VIEW/FILE to compare the field and index information described by the user's manual for the .DDF files with the set of .DDF files you are using. A comparison should be made of the field and index information. If any of the information does not match exactly, then the .DDF files are probably corrupted.

One more thing to note is that if a Btrieve BUTIL -STAT is executed on the DDF files, the results may not match the dictionary file definitions viewed in Xtrieve if the files are corrupted.

.DDF files created with NetWare SQL will have a supplemental index defined for X$Field (FIELD.DDF), but this is only shown in the NetWare SQL Developer's Kit Getting Started manual which shipped with NetWare SQL 3.0. This fourth supplemental index is not shown in the Xtrieve PLUS User's Manuals, and is only defined if the dictionaries were created with NetWare SQL.

To recover corrupted data dictionary files, use MAKE_XTA to extract each file definition. Then, use XCFP to create a command file to rebuild each file. This process can be partially automated by performing the following steps:

  1. Using XQLI or any other SQL statement processor, execute the following statement to extract the file names from the dictionary files and save the output to an ASCII file:
    SELECT Xe$Name FROM X$File
    
    
    (to extract file definition names)

    Then, edit the ASCII file so that it does not contain any of the dictionary file names (X$File, X$Field, etc.)

  2. Edit the ASCII file so that each file definition is recoverable using MAKE_XTA and XCFP as follows: The result from the SELECT statement above was:
    FILEDEF1
    
    FILEDEF2
    
    FILEDEF3
    
    Next, edit the ASCII file to look like this (you may have to cut and paste quite a bit, but it's worth it if you have many files):
    MAKE_XTA /F:"FILEDEF1"
    
    XCFP MAKE_XTA.XTA FILECMD1
    
    MAKE_XTA /F:"FILEDEF2"
    
    XCFP MAKE_XTA.XTA FILECMD2
    
    MAKE_XTA /F:"FILEDEF3"
    
    XCFP MAKE_XTA.XTA FILECMD3
    
    Then, rename the resulting ASCII file with a .BAT extension.
  3. Create a new set of .DDF files in another directory using the Xtrieve PLUS DICTIONARY/CREATE option.
  4. Run the batch file in the directory with the corrupted .DDF files. It will create command files, with a .XTC extension, which can be played back against the new .DDF files created in Step 3.
  5. To recover view definitions, repeat Step 1 with the following statement:
    SELECT Xv$Name FROM X$View
    
    Then, repeat Step 2 using the result from the SELECT statement, editing the ASCII file as follows:
    MAKE_XTA /V:"viewname"
    
    XCFP MAKE_XTA.XTA VIEWCMD1
    
    .
    
    .
    
    .
    
Finally, repeat Step 4.

Prototype Missing from CLib (Network C for NLMs SDK v2.0(e))

In the Network C for NLMs SDK, the ioctl() prototype is missing from the header files of CLIB.NLM v.3.11 b. This generates a warning message from the compiler. For now, you can safely ignore this warning message. The prototype will be included in a later release.

Create/Drop Index Operations within a Transaction (NetWare SQL v3.0)

With NetWare SQL, if an application performs a Create Index or Drop Index operation on a table within a transaction after it has previously updated the same table within the same transaction, the updates will be committed when the Create Index or Drop Index operation completes. The updates cannot be rolled-back, even though the application has not yet issued the COMMIT/ROLLBACK statement.

This anomaly occurs because NetWare SQL must temporarily disable transactions to Btrieve in order to perform the Btrieve Create Index or Drop Index operation. When this operation is complete, all outstanding updates to the file are committed.

In general, applications should not mix DDL (Data Definition Language) operations like Create Index or Drop Index and data updates within a single transaction.


NIBBLES AND BITS

Fast Answers to Common Questions

NetWare C Interface for DOS

Q - When I am running IPXODI v2.0, GetServerAddressTable() and GetServerNameTable() return empty information buffers. The exact same calls function properly under IPXODI v1.2. What should I do?

A - This situation is the result of a known problem with IPXODI v2.0 that will be fixed in the next release. Until then, if you need to use these calls, use IPXODI v1.2.

Q - The documentation for the NetWare C Interface for DOS for BroadcastToConsole(), CloseMessagePipe(), and GetBroadcastMessage() shows an error code "253 (0xFC) MESSAGE_QUEUE_FULL". However, decimal "253" does not equal hex "FC."

A - The hex value is correct. The decimal value should be "252." Tip The ScanDirEntry() And ScanFileEntry() calls do not return the originating/owning namespace of a file or directory entry. To return this information, substitute the NetWare v3.x system call ObtainFileOrSubdirectoryInformation() using the F2 interface. For example code demonstrating this call, contact the Developer Support Group.

NetWare C Interface for Windows

Q - Is it possible to login and logout of a NetWare server from a Windows 3.1 DOS box?

A - In order to log in and out of a NetWare server multiple times from a DOS window, several conditions must be satisfied:

  1. The shell (IPX/ODI and NETX) must be loaded prior to starting Windows.
  2. VIPX.386 should be version 1.13 or later.
  3. Set NWShareHandles = TRUE to share drive mappings among DOS sessions. This parameter is in the [NetWare] section of the Windows SYSTEM.INI file.
  4. A path must be maintained to the \LOGIN subdirectory of a NetWare server.
Q - When programming under Windows v3.1 using the NetWare C Interface for Windows SDK v1.3, the error message, "SPX_NOT_INSTALLED," may be returned when calling the function SPXInitialize(). Similarly, the error message, "IPX_NOT_ INSTALLED," may be returned when calling IPXInitialize().

A - To prevent these error conditions, make certain that you are using the appropriate versions of the following files:

  • IPX.COM v3.10 and above or IPXODI.COM v 1.20 & above
  • VIPX.386 v 1.13 and above
  • NWIPXSPX.DLL v1.31 and up

NetWare Client SDK

Q - Working with the NetWare v4.0 Client SDK, the NWCalls DOS Client Calls don't seem to function. Am I forgetting something?

A - The NWCalls APIs require a call to NWCallsInit() before they will function properly. NWCallsInit() initializes the double byte tables, as well as other lower-level interface functions.

NLM SDK for NetWare v4.0

Q - How can I make my NLM's screen look like a standard Novell NLM screen?

A - Use the NWSNut libraries that are included with the NLM SDK for NetWare v4.0.

WATCOM C/386

Q - I am using WATCOM C/386 v9.0 and the WLINK linker will not export symbols from my NLM. What should I do?

A - Patch the v9.0 linker up to 9.01d, to fix this problem. Patches for WATCOM C/386 are available from WATCOM's BBS at 519-884-2103.

Network C for NLMs

Tip In the Network C for NLMs v2.0(d) documentation, the example for AIOAcquirePort() passes the hardwareType, boardNumber, and portNumber as integers. However, doing so can result in a server abend. To fix the example, pass the hardwareType, boardNumber and portNumber in as pointers to integers.

NetWare Btrieve

Tip The new NetWare Btrieve v6.0 operation 42, to control Continuous Operations on a Btrieve file, can only be called from an NLM application, and not from a workstation application.

Q - How can I create Data Definition Files (.DDF) files to work with third-party products that requires them?

A - You can obtain these .DDf file in two ways:

  • The software company who sold the product should be able to provide the .DDF with their software.
  • Use Xtrieve PLUS, XQL or NetWare SQL to create the .DDF files.

NOVELL DEVELOPER RELATIONS

A special supplement to Novell's Professional Development Series BULLETS

Bundle Up for 1993

You've probably already purchased some warm-weather gear, but have you purchased the development tools you'll need to make it through the winter?

Since your development efforts sometimes require more than one Novell development tool as well as other Novell products, Novell has designed development tool bundles. These bundles provide you with everything you need to develop specific types of applications for the NetWare platform, including tools and comprehensive documentation that explains how the components of the bundle work together, installation, service and support, and licensing issues.

Tool bundles are especially useful for new developers or developers new to a particular type of application development. After purchasing a single tool bundle, you can begin developing your application immediately.

Tool bundles are currently available for network management, NetWare 4.0 client/server application development, and distributed desktop application development using Novell's TCP/IP protocol. The specific bundles offered are:

  • LAN WorkShop
  • NetWare 4.0 tool bundle
  • NetWare Management System tool bundle

LAN WorkShop

With the LAN WorkShop, Novell consolidates its TCP/IP development tools into one package. This bundle includes:
  • LAN WorkPlace for DOS Toolkit
  • LAN WorkPlace for OS/2 Toolkit
  • LAN WorkPlace for Macintosh Toolkit
  • Enhanced version of NetWare Transport Independent Remote Procedure Calls (TIRPC) SDK
All toolkits included with the LAN WorkShop provide both development tools and end-user software.

The LAN WorkPlace for DOS Toolkit allows you to use TCP/IP to build custom applications compatible with Novell's LAN WorkPlace for DOS v4.1. The toolkit software allows you to write DOS, DR-DOS, and Windows applications that use the Novell TCP/IP protocol stack for DOS and Windows via an industry-standard 4.3 BSD socket library API. Applications using TCP/IP gain access to a wide variety of enterprise computing resources, such as PCs, Macintoshes, VAX minicomputers, IBM mainframes, and UNIX workstations.

The LAN WorkPlace for OS/2 Toolkit v3.0 provides the necessary tools for developing OS/2 v2.0 16-bit and 32-bit industry-standard 4.3 BSD socket applications that run with the LAN WorkPlace for OS/2 v3.0. The toolkit includes the LAN WorkPlace for OS/2 end-user program, a TCP/IP stack for building applications that access TCP/IP resources, and requesters for OS/2 v1.3 and v2.0. Applications you develop using this tookit operate with other Novell products that use the LAN WorkPlace for OS/2 APIs.

The LAN WorkPlace for Macintosh Toolkit v1.3 allows you to build applications that use the APIs provided in the Novell TCP/IP for Macintosh (part of the LAN WorkPlace for Macintosh product) or the Apple Macintosh TCP. The Toolkit also provides the necessary development support for building HyperCard stacks that use TCP/IP.

The last component of the LAN WorkShop is the new TIRPC SDK, version 1.1, which is based on the Solaris Open Network Computing Plus TIRPC model from SunSoft, Inc. The TIRPC libraries allow programs to make function calls that can be transported across a network using either TCP/IP or IPX, freeing developers from having to know the semantics of the underlying network.

NetWare 4.0 Tool Bundle

The NetWare 4.0 tool bundle provides all the necessary tools for developing client and server applications for the NetWare 4.0 platform. Products in this tool bundle include:
  • Pre-release version of the NetWare 4.0 operating system
  • NLM SDK for NetWare 4.0
  • NetWare Client SDK
  • WATCOM C/386 compiler and tools
  • LANalyzer for Windows
With this bundle, you can take advantage of all the new features of NetWare 4.0 in your application development. These features include (but are not limited to) NetWare Directory Services (NDS), auditing, memory protection and management, file compression, data migration, core OS process management, media manager, international language enabling, NCP (NetWare Core Protocol) extensions, and backward compatibility with NetWare 3.x.

The NLM SDK for NetWare 4.0 features the NLM library of APIs for NetWare 4.0; the NLM transport interfaces for multiprotocol support in NetWare 4.0; NWSHELL NLM, which provides DOS-like commands that can be executed on the server; a complete set of documentation; and support for WATCOM compiler v9.0 and higher.

The NetWare Client SDK contains software and documentation for developing DOS, Windows, and OS/2 client applications for NetWare 2.x, 3.x, and 4.0. The C libaries provided with this kit have been developed as single set of source code wherever possible, allowing easy application migration between the three supported desktop platforms.

The WATCOM C 32-bit Optimizing Compiler and Tools is also provided with the NetWare 4.0 tool bundle. Tools include a linker, debugger, execution profiler, utilities, documentation, and two libraries: the C graphics library and the C library. The WATCOM compiler can be used to write DOS, Windows, OS/2, and NetWare applications.

The last component in the NetWare 4.0 Tool Bundle, LANalyzer for Windows, is a powerful Windows-based application for monitoring your network on a day-to-day basis, monitoring long-term network trends, analyzing specific problems, and capturing network packets for protocol analysis. It uses a "dashboard" graphical interface consisting of real-time dials depicting network activity. In addition, LANalyzer for Windows lets you print station monitor data, decoded packets, detail graphs, and trend graphs. LANalyzer for Windows installs on any network PC, runs on Ethernet cards, and supports ODI drivers operating in promiscuous mode.

NetWare Management Tool Bundle

The NetWare Management tool bundle provides all the software and documentation necessary for creating network management applications for NetWare. This tool bundle is based on Novell's open network management architecture which allows applications to snap into NetWare's Network Management Map (NMM) platform. The NetWare Management tool bundle includes:
  • NetWare Management System (NMS)
  • Network C for NLMs
  • LANalyzer for Windows
The NetWare Management System SDK includes the NetWare Management Map, and a set of tools and interfaces with which you can create custom management modules that plug into the NetWare Management Map.

The tools and interfaces consists of a set of Windows 3.x Dynamic Data Exchange (DDE) interfaces to an SNMP server and alarm manager, a Btrieve-based database schema, a set of graphical user interface (GUI) tools that let you represent network management indicators as graphic elements, and an application integrator that allows you to create new NMS menu items and network management objects.

The second tool in this bundle is the Network C for NLMs SDK, which fully supports development in both the NetWare v3.1 and v3.11 environments. This SDK includes the NLM library of APIs, NLM transport interfaces, the WATCOM C/386 Optimizing Compiler and Tools, and the NLM Certification Kit.

The final component in this bundle is LANalyzer for Windows, a diagnostic tool that provides a "dashboard" graphical interface that lets you monitor the network on a day-to-day basis, review long-term network trends, analyze specific problems, capture protocol analysis, as well as print station monitor data and graphs of network statistics.

You must be a member of a Novell Developers' Program to purchase these tool bundles.

New NetWare Client SDK Features Single Interface

The NetWare Client SDK, which started shipping in January 1993, features a single interface for writing DOS, DR-DOS, Windows, and OS/2 client applications in the NetWare 2.x, 3.x, and 4.0 environments. The C libraries provided in this kit have been developed as a single set of source code whenever possible, allowing easy application migration between the supported desktop platforms.

This SDK includes a pre-release version of the NetWare 4.0 operating system, the client API libraries, and an API documentation set. It will replace four existing Novell products: NetWare C Interface for DOS, NetWare OS/2 Developer's Kit, NetWare C Interface for Windows, and NetWare System Calls for DOS.

If you purchased NetWare C Interface for DOS, NetWare OS/2 Developer's Kit, NetWare C Interface for Windows, or NetWare System Calls for DOS before September 12, 1992, you can purchase the NetWare Client SDK for a special price for a limited time. If you purchased one of these SDKs after September 12, 1992 and can show proof of purchase, you can receive the NetWare Client SDK free of charge for a limited time.

You must be a member of a Novell Developers' Program to receive this SDK.

Changes to Network Management Tools

With NetWare v3.11, Novell shipped version 1.0 of the SNMP (Simple Network Management Protocol) Agent. This release marked the beginning of the movement toward managing NLMs through SNMP. A new version of the SNMP Agent (v2.0) and set of developer tools is now available as a component of the NetWare Management System (NMS) SDK.

The NMS SDK allows developers to register NLMs with the SNMP agent for SNMP manageability. These new SNMP Agent developer tools replace the NetWare Network Management Toolkit. The SNMP Agent tools define how developers can register an NLM and the SNMP MIB (Management Information Base) associated with the NLM and the SNMP Agent on the server. Any SNMP management station can access the registered NLM's MIB by using the SNMP Agent as a proxy agent for the developers agent. Developers benefit from the SNMP Agent through its mechanism of using the NetWare platform for network management. End users benefit since they have less to learn beyond NetWare and the usage of NLMs.

As part of Novell's ongoing commitment to SNMP and developers already using the NetWare Network Management Toolkit, toolkit users will receive the NMS SDK as well as any future updates.

You must be a member of a Novell Developers' Program to purchase the NetWare Management System SDK.

Five New Development Tools Announced

At NetWorld Boston, Novell announced the availability of five NetWare-enabled third party development tools:
  • Two C++ compilers
  • A FORTRAN compiler
  • A tool that facilitates application connectivity
  • A breakout switch and interface card for programming and debugging
The new compilers include the WATCOM C++ compiler, Draiken Software Inc.'s INTEK C++ v2.1 32-bit compiler, and WATCOM FORTRAN 77/386 compiler.

Additional tools announced include NetWorks! Developer, a productivity tool that enables developers to hot link DDE-enabled applications over Novell's IPX without learning any new syntax or commands, and STOP!, a simple non-maskable interrupt generator that NetWare developers can use in conjunction with debuggers or user programs.

For more information on these tools, developers should contact the individual third-party companies as follows:

  • WATCOM, Sales Department at (519) 886-3700 or (800) 265-4555
  • Draiken Software, Inc. at (503) 222-5417
  • Symbiotics, Inc. at (617) 876-3635 or (800) 989-9174
  • Alpha Logic Technologies, Inc. at (206) 644-3094

SMF v71 SDK Meets MHS Developer Requirements

The NetWare SMF v71 SDK provides everything you need to develop applications and gateways that provide messaging services in NetWare MHS environments, including access to message routing and messaging directory services. NetWare SMF, the native API to Novell's NetWare MHS product line, offers simplicity, reliability, and inherent multiplatform support. The SDK documents the newest generation messaging API and builds on earlier versions to meet developer needs for unlimited recipients, unlimited message size, expanded distribution lists, and long names with hierarchical mulitpart workgroups.

This SDK includes one copy of the 20-mailbox version of NetWare Global Messaging (NGM), one copy of the 100-mailbox version of NGM, and the SMF v71 Programmer's Reference. The SMF v71 Programmer's Reference documents the messaging APIs.

NetWare SMF is currently used by over 900 commercial and corporate developers. Over 150 commercial applications and services are available for an estimated 2.5 million installed MHS mailboxes. These messaging applications range from electronic mail and network fax service to workflow, scheduling, and forms processing.

1993 Begins with New Novell Corporate Developers' Program

In response to the unique development, implementation, and maintenance requirements developers encounter within large corporations, Novell will deliver the Novell Corporate Developers' Program in the second quarter of 1993.

This program is designed to facilitate and accelerate the development of distributed applications that support, exploit, and enhance the NetWare platform in the corporate environment. The program will initially be available worldwide with local implementations in the U.S., U.K., France, and Germany, with additional markets to follow.

Membership in this program is available through an annual subscription and is targeted for large corporations developing industrial-strength applications on the NetWare platform for internal use. Members of the Novell Corporate Developers' Program are entitled to all the benefits available through the Novell Professional Developers' Program, Univel Professional Developers' Program with additional benefits such as project support, system assessment, additional products and development tools, product support, and education.

Project Support

Each program member is assigned an account representative who is familiar with the member's environment and project and who acts as a liaison to other groups within Novell and Univel. In order to better determine product focus for corporate developers, members are also invited to Novell and Univel technical forums, including executive briefings, focus groups, and product strategy meetings. In addition, membership in the Novell Corporate Developers' Program includes admission to BrainShare, Novell's annual technical conference.

Novell System Assessment

Members will be provided system assessment services by Novell's Consulting Services (NCS). Upon request and at no additional charge, program members will be invited to review their existing implementation, business and system needs, project priorities, goals and objectives, and timelines with NCS engineering staff.

With the information from the program member, NCS engineers will use their experience and knowledge of Novell's products to provide a project recommendation in the form of a statement of work. This statement of work can be used as a roadmap by the program member to facilitate their own development effort or to enlist outside consulting services through Novell's consulting services group and partners.

Development Products and Tools

Members of Novell's Corporate Developers' Program are provided with a development copy of Novell's NetWare 2.x, 3.x, or 4.0 or NetWare J, and a copy of UnixWare Personal Edition.

Development copies of the NetWare operating systems are provided to members to facilitate prototyping, development, and testing of new applications without impacting existing business systems. Based on their particular development efforts, members may also select any ten Novell SDKs from the full list of available SDK products including the UnixWare SDK bundled with UnixWare Application Server.

Program members will also receive updates to any of the Novell products they select through the program, ensuring that the application development effort for the NetWare platform is always with the most advanced and current technologies.

Development Product Support

Novell's Developer Support Group offers Novell Corporate Developers' Program members priority access to customer support representatives and support engineers. Support calls from program members will be acknowledged within four hours (during normal business hours). In addition, program members have access to an assigned technician for the duration of the support incident.

Developer Education

The effective transfer of Novell expertise to developers is vital for successful product use and for accelerating the application development timeline. As part of the program, members may attend three Novell technical education development classes throughout the subscription year.

Ongoing Development Support

Ongoing development support is provided to Novell Corporate Developers' Program members, including access to the NDEVREL forum on CompuServe, the Univel Developer Bulletin board, admission to the Advisory Council meetings, Novell developer publications, and all other services offered through Novell developer programs.

For More Information

For additional information on development tools, developer support programs, and the Novell Corporate Developers' Program, call 1-800-NETWARE or 1-801-429-5588 (in the U.S. and Canada), or contact your local international Novell office.

NOVELL DEVELOPER EDUCATION

Novell Developer Education offers several courses for developers who use Novell's development & database tools, including NetWare SQL, Btrieve, Xtrieve PLUS, and the NetWare Client APIs.
904: Btrieve: An Overview
This new course provides a general overview of NetWare Btrieve v6.x and its new features. It covers file structures, indexing, data integrity, record and file locking, caching, operating modes, segmented keys, backward compatibility and utilities.
905: Programming with Btrieve
This course has been enhanced to cover all Btrieve operations & environments. It provides a complete introduction to Novell's server-based record manager. 50% of class time is spent in programming workshops. Working knowledge of C, BASIC, Pascal, or COBOL required. Prerequisite: 904: Btrieve: An Overview.
907: Xtrieve PLUS
This course has been updated to include new features introduced with NetWare SQL v3.0. It teaches developers to use Xtrieve PLUS as a Btrieve or NetWare SQL programming utility. Trains users of Btrieve- or NetWare SQL-based database applications to work effectively with this menu driven utility.
911: NetWare Database Administrator
This new course gives a complete, hands-on look at installing and configuring NetWare SQL and NetWare Btrieve. It covers the basics of ANSI Standard Structured Query Language (SQL), focusing on NetWare SQL and key database features like security, referential integrity (RI), database design, data normalization and performance.
912: Programming with NetWare SQL
This new course is designed for developers and experienced network and database administrators who will be developing NetWare SQL applications or enhancing existing Btrieve applications with NetWare SQL. It provides an in-depth look at the functionality of NetWare SQL and discusses optimizing database systems for development of efficient applications using Novell database tools.
930: Developing NetWare Loadable Modules (NLMs)
This course introduces C programmers to server-based application development in the 32-bit NetWare 3.x environment. It covers basic concepts for writing server-based C applications that access the NetWare 3.x C library (CLib). Requires working knowledge of the C language.
940: NetWare Programming: Basic Services
This new lab-oriented class (40 percent lab work) introduces NetWare programming concepts. It covers topics such as bindery services, file system services, print services, queue management, connection and file-server services, and accounting and synchronization services. This class requires knowledge of the C programming language.
945: NetWare Programming: Protocol Support
This new class covers protocol support features. It also discusses network programming concepts and techniques for developing client-side applications, including Service Advertising Protocol (SAP) IPX/SPX, diagnostics, NetBIOS, TLI, and Named Pipes. This class requires strong knowledge of the C programming language.
To obtain information on pricing, location, scheduling, & course content for classes held in the US, call 1-800-233-3382, 1-801-429-5508 or 1-800-NETWARE. Customers outside of the US should call 1-801-429-5508. For information on availability, location, and prices of classes outside of the US, contact your local Novell office.

FUN AND FACTS

Test your developing skills with the development products by taking our Fun & Facts quiz. (See the end of this section for answers.)
1.   What is the bandwidth of the current Token Ring technology?
A.   Either 4 or 8 MB/sec.
B.   Either 4 or 16 MB/sec
C.   Either 8 or 16 MB/sec.
2.   The NetWare C Interface for DOS function SaveDirectoryHandle() can be used to save
temporary directory handles.
A.   True
B.   False
3.   What was the original name of the "Windows NT" operating system?
A.   Windows v4.0
B.   Windows II v1.0
C.   OS/2 v3.0
4.   Which file does NetWare SQL v3.0 use to store the names of the named databases?
A.   NAMES.DB
B.   DBNAMES.CFG
C.   NAMEDDB.CFG
5.   When a Btrieve file has a key of type Lstring, if the first byte is set to NULL and the rest
of the bytes in the key are not set to NULL, Btrieve does not treat that key as a NULL key.
A.   True
B.   False
6.   Event Service Routines (ESRs) are supported in the (NLM) environment?
A.   True
B.   False
7.   NetWare SQL v3.0 can access Btrieve files on both local and network drives.
A.   True
B.   False
FUN AND FACTS ANSWERS
1.   B
2.   B
3.   C
4.   B
5.   A
6.   A
7.   B

CONTACTING NOVELL

Developer Support

Developers in the U.S. and Canada may contact Novell Developer Support via telephone, fax, BBS or electronic mail via CompuServe, MHS or the Internet.

Voice

For both presales and postsales support, call Novell Developer Support between 8:00 a.m. and 5:00 p.m. Mountain Time at 1-801-429-5588. Many calls to Novell Developer Support are passed to a software support engineer immediately. Calls to Novell Developer Support generally will be acknowledged or answered within four hours.

Fax

If you prefer, you may contact Novell Developer Support via fax at 1-801-429-2990. Faxed questions are acknowledged or answered within 24 hours.

Developer BBS

If you do not have access to either CompuServe or the Internet, send test cases to our BBS. Set your communication software to N-8-1 and call 1-801-429-5836.

E-mail: CompuServe

Post your messages in the appropriate section addressed to Novell at 76701,171. These messages will receive a response within 24 hours.

E-mail: MHS

You may direct your questions and comments to Novell Developer Support via Novell's Message Handling Service E-mail facility. Address your messages to devsup@novell. These messages will receive a response within 24 hours.

E-mail: Internet (SMTP)

An alternative method of contacting Novell Developer Support is through the Internet E-mail system. Send your messages to devsup@novell.com. These messages will receive a response within 24 hours.

NetWire on CompuServe

Novell's NetWire forum is open to all registered CompuServe subscribers. Through the NDEVSUP forum, professional developers writing applications with Novell development tools can gain access to information specific to Novell development. Support, patches, periodicals and product information, as well as information on all of the programs and services provided for Novell developers are accessible through this forum. Post your messages in the appropriate section addressed to Novell at 76701,171. Technical questions will be acknowledged or answered by Novell Developer Support within 24 hours.

Novell Products and SDKs

Novell products on the "Currently Shipping Developer Products" list (see page 15 of this issue), including the Red Box Products, are available to Novell Professional Developer's Program members. Call 1-800-RED-WORD (1-800-733-9673) or 1-303-894-4135 to order these products or to receive additional information. To order other Red Box Products not listed, contact your local Novell office or Novell Authorized Reseller.

DeveloperNet Labs

For information on DeveloperNet Labs development tools, education classes and product certification, in the U.S. and Canada call 1-800-453-1267 ext. 5544 or 1-801-429-5544, or call your local Novell office (see back cover of this issue).

Novell Developer Relations

Novell Professional Developers or those wishing to become members may contact Novell Developer Relations via telephone, fax, or electronic mail via Compuserve, MHS or the Internet.

Voice

For general information or questions on Novell Developer Relations programs, in the U.S. or Canada call 1-800-RED-WORD (1-800-733-9673). All others call 1-801-429-5281.

Fax

If you prefer, you may contact Novell Developer Relations via fax at 1-801-429-7207.

NetWire on CompuServe

Novell's NetWire forum is open to all registered Compuserve subscribers. Through the NDEVREL forum, Novell Professional Developer's Program-related issues or general questions may be posted. Through the NDEVINFO forum, customers who do not have products may post pre-sales product information questions on all Novell SDKs.

E-mail: MHS or Internet (SMTP)

You may direct your questions and comments to Novell Developer Relations via Novell's Message Handling Service E-mail facility. Address your messages to devprog@novell.com. Use the same address when going through the Internet E-mail system.

ACKNOWLEDGEMENTS

Publisher: Mad Poarch
Editor: Kirk R. Humphries
Design: Creative Services, Provo

Contributing authors: Gaurang Amin Linda Anderson Michael Eisa Neda Eslami Jack Gumaer Ross Hopson Sudz Khawaja Nancy Kromar Matt Pinsonneault Bob Quinlan Clint McVey Randy Reddy Holly Roff Mike Shoemaker Aslam Tejani

Special thanks to the Developer Support, Development, Developer Relations, Product Marketing, and Marketing Communications staff who contributed time and valuable input.

Novell, the N design, NetWare, Btrieve, XQL, LAN WorkPlace and LANalyzer are registered trademarks; NetWare Loadable Module (NLM), NetWare Global Messaging, NetWare System Calls for DOS, NetWare Runtime, NetWare SQL, NetWare Btrieve, NetWare C Interface for DOS, NetWare System Interface Technical Overview, NetWare RPC, NetWare RPC 386, NetWare LU6.2, Report Executive, NetWare MHS, NetWare Asynchronous Communication Services (NACS), NetWare Management System, Professional Development Series, NetWare 3270 LAN Workstation and Xtrieve PLUS are trademarks; and NetWire and Professional Developers' Program are service marks of Novell, Inc. IBM and OS/2 are registered trademarks, and NetBIOS and SAA are trademarks of International Business Machines Corporation.

Microsoft is a registered trademark, and Windows is a trademark of Microsoft Corporation.

Apple, AppleTalk, HyperCard and Macintosh are registered trademarks of Apple Computer, Inc.

CompuServe is a registered trademark of CompuServe Corporation.

NFS and Solaris are registered trademarks, and SunSoft is a trademark of Sun Microsystems, Inc.

UNIX is a trademark of UNIX Systems Laboratories, Inc., a subsidiary of AT&T. Univel is trademark of Univel, Inc.

(c) 1993 Novell, Inc. All rights reserved.
Professional Development Series
BULLETS
JANUARY 1993