[darwinbuild-changes] [684] branches/PR-7489777/darwinup
source_changes at macosforge.org
source_changes at macosforge.org
Mon Feb 1 10:08:18 PST 2010
Revision: 684
http://trac.macosforge.org/projects/darwinbuild/changeset/684
Author: wsiegrist at apple.com
Date: 2010-02-01 10:08:17 -0800 (Mon, 01 Feb 2010)
Log Message:
-----------
Partial implementation of schema creation
Modified Paths:
--------------
branches/PR-7489777/darwinup/Column.cpp
branches/PR-7489777/darwinup/Column.h
branches/PR-7489777/darwinup/Database.cpp
branches/PR-7489777/darwinup/Database.h
branches/PR-7489777/darwinup/Table.cpp
branches/PR-7489777/darwinup/Table.h
Modified: branches/PR-7489777/darwinup/Column.cpp
===================================================================
--- branches/PR-7489777/darwinup/Column.cpp 2010-02-01 17:02:45 UTC (rev 683)
+++ branches/PR-7489777/darwinup/Column.cpp 2010-02-01 18:08:17 UTC (rev 684)
@@ -30,36 +30,41 @@
* @APPLE_BSD_LICENSE_HEADER_END@
*/
+#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "Column.h"
Column::Column() {
- m_name = strdup("unnamed_column");
- m_type = SQLITE_INTEGER;
- m_is_index = false;
- m_is_pk = false;
- m_is_unique = false;
+ m_name = strdup("unnamed_column");
+ m_create_sql = NULL;
+ m_type = SQLITE_INTEGER;
+ m_is_index = false;
+ m_is_pk = false;
+ m_is_unique = false;
}
Column::Column(const char* name, uint32_t type) {
- m_name = strdup(name);
- m_type = type;
- m_is_index = false;
- m_is_pk = false;
- m_is_unique = false;
+ m_name = strdup(name);
+ m_create_sql = NULL;
+ m_type = type;
+ m_is_index = false;
+ m_is_pk = false;
+ m_is_unique = false;
}
Column::Column(const char* name, uint32_t type, bool is_index, bool is_pk, bool is_unique) {
- m_name = strdup(name);
- m_type = type;
- m_is_index = is_index;
- m_is_pk = is_pk;
- m_is_unique = is_unique;
+ m_name = strdup(name);
+ m_create_sql = NULL;
+ m_type = type;
+ m_is_index = is_index;
+ m_is_pk = is_pk;
+ m_is_unique = is_unique;
}
Column::~Column() {
free(m_name);
+ free(m_create_sql);
}
const char* Column::name() {
@@ -70,6 +75,23 @@
return m_type;
}
+const char* Column::typestr() {
+ switch(m_type) {
+ case SQLITE_INTEGER:
+ return "INTEGER";
+ break;
+ case SQLITE_TEXT:
+ return "TEXT";
+ break;
+ case SQLITE_BLOB:
+ return "BLOB";
+ break;
+ default:
+ fprintf(stderr, "Error: unknown column type: %d \n", m_type);
+ return "UNKNOWN";
+ }
+}
+
const bool Column::is_index() {
return m_is_index;
}
@@ -82,3 +104,11 @@
return m_is_unique;
}
+const char* Column::create() {
+ if (!m_create_sql) {
+ asprintf(&m_create_sql, " %s %s %s %s ", m_name, this->typestr(),
+ (this->is_pk() ? "PRIMARY KEY AUTOINCREMENT" : ""),
+ (this->is_unique() ? "UNIQUE" : ""));
+ }
+ return (const char*)m_create_sql;
+}
Modified: branches/PR-7489777/darwinup/Column.h
===================================================================
--- branches/PR-7489777/darwinup/Column.h 2010-02-01 17:02:45 UTC (rev 683)
+++ branches/PR-7489777/darwinup/Column.h 2010-02-01 18:08:17 UTC (rev 684)
@@ -42,14 +42,17 @@
const char* name();
const int type();
-
+ const char* typestr();
+ const char* create();
+
const bool is_index();
const bool is_pk();
const bool is_unique();
protected:
char* m_name;
- uint32_t m_type; // SQLITE_* type definition
+ char* m_create_sql;
+ uint32_t m_type; // SQLITE_* type definition
bool m_is_index;
bool m_is_pk;
bool m_is_unique;
Modified: branches/PR-7489777/darwinup/Database.cpp
===================================================================
--- branches/PR-7489777/darwinup/Database.cpp 2010-02-01 17:02:45 UTC (rev 683)
+++ branches/PR-7489777/darwinup/Database.cpp 2010-02-01 18:08:17 UTC (rev 684)
@@ -51,6 +51,9 @@
m_tables = (Table**)malloc(sizeof(Table*) * m_table_max);
m_db = NULL;
m_path = strdup(path);
+ if (!m_path) {
+ fprintf(stderr, "Error: ran out of memory when constructing database object.\n");
+ }
}
Database::~Database() {
@@ -62,6 +65,29 @@
}
+const char* Database::path() {
+ return m_path;
+}
+
+bool Database::connect() {
+ int res = 0;
+ res = sqlite3_open(m_path, &m_db);
+ if (res) {
+ sqlite3_close(m_db);
+ m_db = NULL;
+ fprintf(stderr, "Error: unable to connect to database at: %s \n", m_path);
+ return false;
+ }
+ return true;
+}
+
+bool Database::connect(const char* path) {
+ this->m_path = strdup(path);
+ if (!m_path) fprintf(stderr, "Error: ran out of memory when trying to connect to database.\n");
+ return m_path && this->connect();
+}
+
+
bool Database::add_table(Table* t) {
if (m_table_count >= m_table_max) {
m_tables = (Table**)realloc(m_tables, m_table_max * sizeof(Table*) * 4);
@@ -77,36 +103,50 @@
}
+
+/**
+ *
+ * Darwinup database abstraction. This class is responsible
+ * for generating the Table and Column objects that make
+ * up the darwinup database schema, but the parent handles
+ * deallocation.
+ *
+ */
DarwinupDatabase::DarwinupDatabase() {
m_path = strdup("");
+ this->init();
}
DarwinupDatabase::DarwinupDatabase(const char* path) {
m_path = strdup(path);
-
+ this->init();
+}
+
+DarwinupDatabase::~DarwinupDatabase() {
+ // Database (parent) automatically deallocates schema objects
+}
+
+void DarwinupDatabase::init() {
Table* archives = new Table("archives");
- assert(archives->add_column(new Column("serial", SQLITE_INTEGER, false, true, false)));
- assert(archives->add_column(new Column("uuid", SQLITE_BLOB, true, false, true)));
- assert(archives->add_column(new Column("name", SQLITE3_TEXT)));
+ // index pk unique
+ assert(archives->add_column(new Column("serial", SQLITE_INTEGER, false, true, false)));
+ assert(archives->add_column(new Column("uuid", SQLITE_BLOB, true, false, true)));
+ assert(archives->add_column(new Column("name", SQLITE3_TEXT)));
assert(archives->add_column(new Column("date_added", SQLITE_INTEGER)));
- assert(archives->add_column(new Column("active", SQLITE_INTEGER)));
- assert(archives->add_column(new Column("info", SQLITE_INTEGER)));
+ assert(archives->add_column(new Column("active", SQLITE_INTEGER)));
+ assert(archives->add_column(new Column("info", SQLITE_INTEGER)));
assert(add_table(archives));
-
+
Table* files = new Table("files");
- assert(files->add_column(new Column("serial", SQLITE_INTEGER, false, true, false)));
+ // index pk unique
+ assert(files->add_column(new Column("serial", SQLITE_INTEGER, false, true, false)));
assert(files->add_column(new Column("archive", SQLITE_INTEGER)));
- assert(files->add_column(new Column("info", SQLITE_INTEGER)));
- assert(files->add_column(new Column("mode", SQLITE_INTEGER)));
- assert(files->add_column(new Column("uid", SQLITE_INTEGER)));
- assert(files->add_column(new Column("gid", SQLITE_INTEGER)));
- assert(files->add_column(new Column("size", SQLITE_INTEGER)));
- assert(files->add_column(new Column("digest", SQLITE_BLOB)));
- assert(files->add_column(new Column("path", SQLITE3_TEXT)));
- assert(add_table(files));
+ assert(files->add_column(new Column("info", SQLITE_INTEGER)));
+ assert(files->add_column(new Column("mode", SQLITE_INTEGER)));
+ assert(files->add_column(new Column("uid", SQLITE_INTEGER)));
+ assert(files->add_column(new Column("gid", SQLITE_INTEGER)));
+ assert(files->add_column(new Column("size", SQLITE_INTEGER)));
+ assert(files->add_column(new Column("digest", SQLITE_BLOB)));
+ assert(files->add_column(new Column("path", SQLITE3_TEXT)));
+ assert(add_table(files));
}
-
-DarwinupDatabase::~DarwinupDatabase() {
-}
-
-
Modified: branches/PR-7489777/darwinup/Database.h
===================================================================
--- branches/PR-7489777/darwinup/Database.h 2010-02-01 17:02:45 UTC (rev 683)
+++ branches/PR-7489777/darwinup/Database.h 2010-02-01 18:08:17 UTC (rev 684)
@@ -45,6 +45,7 @@
virtual ~Database();
const char* path();
+ bool connect();
bool connect(const char* path);
const char* get_value(const char* table, const char* column, const char* where);
@@ -76,17 +77,20 @@
};
+
+
/**
*
* Darwinup database abstraction. This class is responsible
* for generating the Table and Column objects that make
- * up the darwinup database schema.
+ * up the darwinup database schema, but the parent handles
+ * deallocation.
*
*/
struct DarwinupDatabase : Database {
DarwinupDatabase();
DarwinupDatabase(const char* path);
virtual ~DarwinupDatabase();
-
+ void init();
};
Modified: branches/PR-7489777/darwinup/Table.cpp
===================================================================
--- branches/PR-7489777/darwinup/Table.cpp 2010-02-01 17:02:45 UTC (rev 683)
+++ branches/PR-7489777/darwinup/Table.cpp 2010-02-01 18:08:17 UTC (rev 684)
@@ -41,6 +41,7 @@
m_column_count = 0;
m_columns = (Column**)malloc(sizeof(Column*) * m_column_max);
m_name = strdup("unnamed_table");
+ m_create_sql = NULL;
}
Table::Table(const char* name) {
@@ -48,6 +49,7 @@
m_column_count = 0;
m_columns = (Column**)malloc(sizeof(Column*) * m_column_max);
m_name = strdup(name);
+ m_create_sql = NULL;
}
Table::~Table() {
@@ -56,9 +58,19 @@
}
free(m_columns);
free(m_name);
+ free(m_create_sql);
}
+const char* Table::name() {
+ return m_name;
+}
+
+const Column** Table::columns() {
+ return (const Column**)m_columns;
+}
+
+
bool Table::add_column(Column* c) {
if (m_column_count >= m_column_max) {
m_columns = (Column**)realloc(m_columns, m_column_max * sizeof(Column*) * 4);
@@ -73,3 +85,27 @@
return true;
}
+
+const char* Table::create() {
+ if (!m_create_sql) {
+ // get creation sql for each column
+ const char* cols[m_column_count];
+ const char* indexes[m_column_count];
+ for (uint32_t i=0; i<m_column_count; i++) {
+ cols[i] = m_columns[i]->create();
+ // get creation sql for any indexes
+ if (m_columns[i]->is_index()) {
+ indexes[i] = m_columns[i]->create();
+ } else {
+ indexes[i] = NULL;
+ }
+ }
+
+ asprintf(&m_create_sql, "CREATE TABLE %s ( );", m_name);
+ }
+
+ return m_create_sql;
+}
+
+
+
Modified: branches/PR-7489777/darwinup/Table.h
===================================================================
--- branches/PR-7489777/darwinup/Table.h 2010-02-01 17:02:45 UTC (rev 683)
+++ branches/PR-7489777/darwinup/Table.h 2010-02-01 18:08:17 UTC (rev 684)
@@ -41,6 +41,7 @@
const char* name();
const Column** columns();
+ bool add_column(Column*);
// return SQL statements for this table
const char* create();
@@ -51,14 +52,12 @@
const char* update(const char* set, const char* where, uint32_t &count);
const char* del(const char* where, uint32_t &count);
const char* insert(const char* columns, const char* values);
-
- bool add_column(Column*);
-
-protected:
-
+protected:
+
char* m_name;
+ char* m_create_sql;
Column** m_columns;
uint32_t m_column_count;
uint32_t m_column_max;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/darwinbuild-changes/attachments/20100201/25db258d/attachment-0001.html>
More information about the darwinbuild-changes
mailing list