An implementation page that is not categorized.

Cassandra versus SQL

Each block of data that we manage in Cassandra is 100% an equivalent to an SQL table.

For example, we could create a simple table to manage pages as this one:


This table includes a page_identifier that gives you a way to reference this table from another table. Now I write another module that extends a page and gives it a teaser capability. What directly comes to mind (at least to me) is adding the teaser field to the table:


This is very good since that way we do not increase the search time ...


The one main reason for Cassandra is speed. However, Cassandra lacks the usual SQL connectivity capabilities (i.e. why we call SQL databases relational.) In other words, an SQL statement can be used to connect many tables together without the need for said data to be otherwise connected is powerful but not available in Cassandra.

  • One to One case

In an SQL database, it is customary to extend a table by creating a new table and having a one to one connection. For example, a User table is likely to offer a user identifier (user_id) column. You can now create an ...


What are lists?

Note: the feature is defined here: List feature [core]

See also the C-like Expressions.

Many of the entries in a website are lists:

  • List of the most recent comments
  • List of all the comments
  • List of the comments on a given page
  • List of all the pages
  • List of the blog pages
  • List of pages of documentation
  • List of a page tags
  • List of the connected users
  • List of users who posted over 100 comments
  • etc.

The number of lists is pretty much infinite and is really only limited by the data available on your website and your ...


What is a Dependency?

Whenever you create a page you generate dependencies.

For example, a page may include its own content, the list of the last 3 pages created on your website, the list of the last 5 news feed titles, and the teaser of another page in a box.

These are all called dependencies.

When you change a page's own content, that page is marked as changed and in general we're done.

However, in cases where a page A is referenced in a page B, we need to refresh page B with the new content in page A.

For example, in our prevent example we mentioned the idea of showing a ...

Some people may have an old system that uses a certain number of paths. Say you have an existing static website that is 1,000 pages. Converting it to the new system would take a while and is not a necessity. Instead, you use the new system with a sub-folder in your URL:


Here the snapwebsite participates in the website selection (see Website Selector and URL Basics).

Root Problems

There is one huge drawback with this technique: all the files found at the root of a website will still be found at that root. This includes files such as ...

Sub-domain support

Sub-Domain Support

As mentioned on our previous page, it is possible to make use of sub-domains.

For example, you can use a language sub-domain as in http://en.example.com/.

We will support different kind of sub-domains to allow for different website setup.

Website Selectors

By default sub-domains are used in the website selection process (see the URL Basics page for detailed information on selecting a website.)

Data Selectors

The language example is called a selector. It allows you to select a different set of data within the same website. Some of the parts defined in the ...

Protocol Support

We support the HTTP and HTTPS protocols.

At our level, both protocol very look the same since Apache takes care of all the necessary encryption mechanism.

However, there is one flag that tells us whether we are working in secure or non-secure mode and we want to use that flag for the following reasons:

  1. When the user registers, logs in, cart, payments and any other form that is considered private (i.e. not the search form, not a simple poll form...)
  2. When accessed from another website (Facebook pages and alike)

The Core system will be capable of automatically switching between ...


The Snap! Websites system is driven by the URL used to access the site. Everything in the URL may play a role in deciding what is going to be displayed (actually, other Browser parameters may also affect the data returned such as the Browser language, however, only the URL is used to determine which website you are accessing.)

Note: This is fully implemented and works as expected (domain & website determination and full discovery of the website concerned.)


The following URL:


has the following parts defined in ...


C++ Direct Dependencies


Note: We are moving to using Qt a lot more than boost. Qt offers many of the boost features and it handles XML, XSLT, and a few other things that we're using for Snap! (libQtCassandra, libQtSerialization, etc.)

The boost library is full of goodies. We use it for all sorts of things although we try to limit ourselves to the basics such as shared pointers1

  • 1. Note that we will not be using the boost shared pointers much since Qt offers a similar object and we are switching to Qt instead. Also we could use the standard library shared pointers ...


The following includes highly technical documentation informations. This is for developers, not end users. (At this point we do not have a user documentation since the product doesn't exist yet.)

We now have started to really work hard on the development and offer a page with the current development status of Snap! C++.

Snap! Websites
An Open Source CMS System in C++

Contact Us Directly