Skip to content

Latest commit

 

History

History
135 lines (87 loc) · 4.3 KB

EasyDao.md

File metadata and controls

135 lines (87 loc) · 4.3 KB

EasyDAO: One-stop shop for data source configuration

A DAO, or Data Access Object, is a universal interface to a collection of objects. foam.dao.EasyDAO configures itself automatically, based on the configuration flags you specify when creating an EasyDAO.

To store your class in an EasyDAO, just add an id property:

foam.CLASS({
  package: 'fun',
  name: 'StoreMe',
  properties: [ 'id' ],
});

Your id must be unique for separate objects, so either set it carefully or set EasyDAO.seqNo to true to assign id automatically.

Storage Type

The basic storage mechanism your EasyDAO will provide is configured by setting daoType:

Choose a default for IndexedDB, browser local storage, or in-memory MDAO:

foam.dao.EasyDAO.create({ daoType: 'IDB' });
foam.dao.EasyDAO.create({ daoType: 'LOCAL' });
foam.dao.EasyDAO.create({ daoType: 'MDAO' });

or specify the actual DAO class to use:

foam.dao.EasyDAO.create({ daoType: foam.dao.NullDAO });

Note that if you enable server-synchronization or journalling, the extra DAOs created to support those features will be of the same type.

Caching

For IndexedDB, disk or network-based DAO types, in-memory caching significantly speeds up data access and querying. Add cache: true to automatically set up an MDAO as an indexed, in-memory cache.

foam.dao.EasyDAO.create({ cache: true });

Note that if caching is enabled, autoIndex can be enabled to automatically generate indexes as queries are made. The addIndex() method can be used to manually add indexes.

ID Assignment

To ensure your objects have unique IDs, you can use sequence numbers or guids to auto-assign unique ids to the objects put() into the EasyDAO. Specify the property name in seqProperty if you are not using the default of id as your primary key.

foam.dao.EasyDAO.create({ seqNo: true, seqProperty: 'id' });

or

foam.dao.EasyDAO.create({ guid: true, seqProperty: 'id' });

You can't use both at once, and they are optional if your objects already have unique identifiers.

Special Features

String Deduplication

If your object has a lot of String properties, enable dedup to ensure that duplicate string values don't eat up a lot of memory.

foam.dao.EasyDAO.create({ dedup: true });

Journalling

To record a complete journal of all writes to your EasyDAO, you can enable journal to keep a history.

foam.dao.EasyDAO.create({ journal: true });

Note that this history is stored in the same type of DAO as your EasyDAO (IndexedDB, MDAO, etc.) and will be very large if your DAO has a lot of activity. The complete state of each object may be stored on each put() or remove() operation.

Contextutalizing

If your data model has imports, it will need a parent context from which to find those import values. This can be provided by enabling contextualize on your EasyDAO, and making sure the EasyDAO itself, or one of its ancestors in the creation chain, exports those values.

foam.dao.EasyDAO.create({ contextualize: true });

Debug features

You can enabled console logging of DAO operations by enabling logging:

foam.dao.EasyDAO.create({ logging: true });

And for benchmarking, timing of DAO operations is enabled with timing

foam.dao.EasyDAO.create({ timing: true });

Synchronization between multiple Clients and Server

Turn on syncWithServer to activate synchronization with a server. Specify serverUri and syncProperty as well.

syncProperty indicates the property to synchronize on. This is typically an integer property indicating the version last seen on the remote server. Use an actual property reference (such as example.MyClass.MY_PROPERTY) not the string name of the property.

serverUri specifies the URI of the server to use. If sockets is true, this will use a web socket, otherwise HTTP to contact the server-side DAO. On your server, use an EasyDAO with isServer: true to provide the other end of the connection.

Setting syncPolling to true activates polling, periodically checking in with the server. If sockets are used, polling is optional as the server can push changes to this client.

foam.dao.EasyDAO.create({
  ...
  syncWithServer: true,
  syncProperty: foo.myModel.VERSION,
  serverUri: 'localhost:7000',
  syncPolling: true,
  sockets: false
});