SIMPOL Documentation

Programming with SBME Databases

Essentially, working with SBME databases from a programmatic standpoint is virtually no different to working with PPCS databases. For a fairly in-depth description please see the section called “Object-Oriented Database Access” and Chapter 12, Using Databases in SIMPOL. The only significant differences arise in the creation and opening of SBME databases. To open an SBME database, the new() method of the sbme1 is called. In that call the name of the database file and the action to take must be specified. The action can be one of the following characters or combinations of characters:

  • O — open

  • C — create

  • R — replace

  • OC — open if exists otherwise create

  • RC — replace if exists otherwise create

Once the file has been opened the sbme1 object can be used to retrieve the list of tables and if the table name is known the opentable() method can be used to retrieve a reference to the table. From that point onwards things work identically to the way PPCS works for accessing fields, indexes, and records other than a difference in terms of the types of information available for the actual objects (properties and methods for things like readonly, required, etc.).

Creating an SBME database is done by first opening or creating an sbm file and then by calling the newtable() method. The following function is part of the db1util.sml library that is included in the lib directory. The entire source code to the project can be found in the projects\libs\db1util directory.

function create_sbme1table_from_db1table(type(db1table) dbSrc, \
                                       sbme1 sbmFile, 
                                       string sNewTableName) export
  integer iResult, iErrnum
  string sTablename
  type(db1field) fld
  sbme1newtable sbmnt
  sbme1newfield sbmnfld
  sbme1newindex sbmnidx

  iResult = iIMEX_ERR_SUCCESS

  if dbSrc =@= .nul
    iResult = iIMEX_ERR_PPCSOBJNUL
  else if sbmFile =@= .nul
    iResult = iIMEX_ERR_SBMEOBJNUL
  else
    if sNewTableName > ""
      sTablename = sNewTableName
    else
      iErrnum = 0
      if dbSrc.type =@= ppcstype1file
        sTablename = dbSrc.filename
      else if dbSrc.type =@= sbme1table
        sTablename = dbSrc.tablename
      end if
    end if

    if sTablename > ""
      iErrnum = 0
      sbmFile.lock("shared", iErrnum)
      if iErrnum != 0
        iResult = iIMEX_ERR_SBMEOBJLOCKED
      else
        sbmnt =@ sbmFile.newtable(sTablename)
        if sbmnt =@= .nul
          iResult = iIMEX_ERR_SBMETABLECREATEFAILED
        else
          fld =@ dbSrc.firstfield
  
          while
            sbmnfld =@ sbmnt.newfield(fld.name, fld.datatype)
            if fld.index !@= .nul and fld.datatype !@= number
              sbmnidx =@ sbmnt.newindex(sbmnfld, 100, "")
            end if

            fld =@ fld.next
          end while fld =@= dbSrc.firstfield

          sbmnt.create(iErrnum)
          if iErrnum != iSIMPOL_ERR_SUCCESS
            iResult = iIMEX_ERR_SBMETABLECOMMITFAILED
          end if
          sbmFile.commit()
        end if
        iErrnum = 0
        sbmFile.unlock(iErrnum)
      end if
    end if
  end if
end function iResult

From the preceding program code, specifically following the statement if sTablename > "" the order of events when creating a new table is:

  • Get at least a shared lock on the sbme1 object using the lock() method

  • Create a new table with the desired name using the newtable() method, which returns a sbme1newtable object

  • For each field desired create a new field using the newfield() method of the sbme1newtable object

  • If a field should also be indexed then create an index on the new field using the newindex() method of the sbme1newtable object and passing the reference to the sbme1newfield object

  • Create the table by calling the create() method of the sbme1newtable object

  • Call the commit() method of the sbme1 object to write the changes back to the file

  • Call the unlock() method of the sbme1 object

There is also a number of tools and library modules being created that are intended to make importing data and creating files easier. Watch the projects directory for ongoing changes.