diff --git a/database/db_types.anubis b/database/db_types.anubis index eb3aac5..82103dd 100644 --- a/database/db_types.anubis +++ b/database/db_types.anubis @@ -22,19 +22,6 @@ transmit calexium_lib/database/types/db_integer.anubis public type DB_ID: none, pk(Int value). - -//public type DB_datetime: -// db_datetime(String datetime). //Date and time in ISO8601 format "YYYY-MM-DD hh:mm:ss" - -//public type DB_date: -// db_date(String date). //Date in ISO8601 format "YYYY-MM-DD" -// -//public type DB_time: -// db_time(String time). //Time in ISO8601 format "hh:mm:ss" -// -//public type DB_integer: -// db_integer(Int value). - public define String to_String diff --git a/database/db_version.anubis b/database/db_version.anubis new file mode 100644 index 0000000..ee0bd42 --- /dev/null +++ b/database/db_version.anubis @@ -0,0 +1,68 @@ +/* + * Created by PyramIDE. + * User: フランスのトトロ aka (David RENÉ) + * Date: 09/07/2017 + * Time: 00:52 + * © Calexium + */ + +transmit tools/basis.anubis +transmit calexium_lib/types/version.anubis + +public type DB_Version_Compare_Result: + less, + more, + equal, + equal_but_sign +. + +public type DB_Version: + db_version ( + Version version, //version of database + String db_hash //signature like SHA1 etc + ) +. + +public define DB_Version + db_v_0 = + db_version(version(0), "") +. + +public define String + String s + DB_Version db_v = + s + db_v.version + " " + db_v.db_hash +. + + +public define String + DB_Version db_v + String s = + db_v.version + " " + db_v.db_hash + s +. + + +public define DB_Version_Compare_Result + compare_db_version + ( + DB_Version v_x, + DB_Version v_y + ) = + if v_x.version.numeric +< v_y.version.numeric then + more + else if v_x.version.numeric = v_x.version.numeric then + if v_x.db_hash = v_y.db_hash then + equal + else + equal_but_sign + else + less +. + +public define Bool + db_version_less + ( + DB_Version v_x, + DB_Version v_y + )= + // +=< below is unsigned comparison for Word32 + if v_x.version.numeric +=< v_y.version.numeric then true else false +. diff --git a/database/migration_common_sqlite3.anubis b/database/migration_common_sqlite3.anubis index 91ace4b..e339d49 100644 --- a/database/migration_common_sqlite3.anubis +++ b/database/migration_common_sqlite3.anubis @@ -1,192 +1,193 @@ -/* - * Created by PyramIDE. - * User: ricard - * Date: 03/12/2008 - * Time: 13:07 - * - */ - -read tools/basis.anubis -read system/logger.anubis -read data_base/sqlite.anubis -read data_base/alter_table.anubis //for sqlite3 version of alter_table -read data_base/db_types.anubis //FK... -read data_base/sqlite_foreign_key.anubis - -read calexium_lib/database/db_utils.anubis -read calexium_lib/net_services_protocols/logger_service.anubis - -public type DbTable: - table(String name, String create_query), - table(String db_name, String name, String create_query), - view(String name, String create_query). - - -public define Bool - is_table_exists - ( - SQLite3DataBase db, - String dbName, - String table_name - )= - if sql_query_timeout(db, "SELECT * FROM " + dbName + ".sqlite_master WHERE type ='table' AND tbl_name =:table_name", [bind_String(":table_name", table_name)], "is_table_exists("+table_name+")") is - { - error(_) then false, //error in the SQL request - ok(_, cursor, _) then - if cursor(unique) is - { - error(_) then false, - no_more_row then false, - row(current) then true - } - }. - -public define Bool - is_table_exists - ( - SQLite3DataBase db, - String table_name - )= - is_table_exists(db, "main", table_name). - -public define Bool - is_empty_database - ( - SQLite3DataBase db, - String dbName, - )= - if sql_query_timeout(db, "SELECT * FROM " + dbName + ".sqlite_master", [], "is_empty_database("+dbName+")") is - { - error(_) then true, //error in the SQL request - ok(_, cursor, _) then - if cursor(unique) is - { - error(_) then true, - no_more_row then true, - row(current) then false - } - }. - -public define Bool - is_empty_database - ( - SQLite3DataBase db, - )= - is_empty_database(db, "main"). - -public define Maybe(One) - drop_all_triggers - ( - SQLite3DataBase db, - Logger log - ) = - if sqlite3_query(db, "SELECT name FROM sqlite_master WHERE type = 'trigger'", []) is - { - error(err) then logError(log, db_error(err, "drop_all_triggers")); failure, - ok(_, cursor, _) then - with drop_trigger = (String name) |-> if sqlite3_query(db, "DROP TRIGGER " + name, []) is - { - error(err2) then logError(log, db_error(err2, "Failed to drop trigger '" + name + "'")), - ok(_, cursor, _) then unique - }, - map_forget(drop_trigger, db_get_string_list(cursor, [])); - success(unique) - }. - -public define Maybe(One) - create_tables - ( - SQLite3DataBase db, - Logger logger, - List(DbTable) tables, - String version_string - ) = - if tables is - { - [] then success(unique), - [h . t] then - if h is - { - table(table_name, create_string) then - if alter_table(db, table_name, create_string, logger) is - { - failure then logError(logger, "Version "+version_string+": Can't create '"+table_name+"' table"); failure, - success(_) then create_tables(db, logger, t, version_string) - }, - table(db_name, table_name, create_string) then - if alter_table(db, db_name, table_name, create_string, logger) is - { - failure then logError(logger, "Version "+version_string+": Can't create '"+db_name+"."+table_name+"' table"); failure, - success(_) then create_tables(db, logger, t, version_string) - }, - view(view_name, create_string) then - if alter_view(db, view_name, create_string, logger) is - { - failure then logError(logger, "Version "+version_string+": Can't create '"+view_name+"' view"); failure, - success(_) then create_tables(db, logger, t, version_string) - }, - } - }. - - -public define Maybe(One) - create_indexes - ( - SQLite3DataBase db, - Logger logger, - List(String) indexes, - String version_string - )= - if indexes is - { - [] then success(unique), - [h . t] then - if sql_query_timeout(db, h, [], "Version "+version_string+": create indexes") is - { - error(_) then failure, - ok(_,_,_) then create_indexes(db, logger, t, version_string) - } - }. - - -public define One - make_foreign_key - ( - SQLite3DataBase db, - String table_name, - String field_name, - String foreign_table_name, - String foreign_field_name, - Bool fk_null, - Bool fk_cascade, - Logger log - ) = - if (Maybe(One))make_foreign_key(db, table_name, field_name, foreign_table_name, foreign_field_name, fk_null, fk_cascade, log) is - { - failure then - logError(log, "Can't create foreign key constraint between '"+table_name+"' and '"+foreign_table_name+"' tables"), - success(_) then - unique - }. - -public define Maybe(One) - make_foreign_keys - ( - SQLite3DataBase db, - Logger logger, - List((String, String, String, String, FK_Null, FK_Cascade)) relations, - String version_string - )= - if relations is - { - [] then success(unique), - [h . t] then - if h is (table_name, field_name, foreign_table_name, foreign_field_name, fk_null, fk_cascade) then - if (Maybe(One))make_foreign_key(db, table_name, field_name, foreign_table_name, foreign_field_name, fk_null, fk_cascade, logger) is - { - failure then - logError(logger, "Version "+version_string+": Can't create foreign key constraint between '"+table_name+"' and '"+foreign_table_name+"' tables"); failure, - success(_) then - make_foreign_keys(db, logger, t, version_string) - } - }. +/* + * Created by PyramIDE. + * User: ricard + * Date: 03/12/2008 + * Time: 13:07 + * + */ + +read tools/basis.anubis +read system/logger.anubis +read data_base/sqlite.anubis +read data_base/alter_table.anubis //for sqlite3 version of alter_table +read data_base/db_types.anubis //FK... +read data_base/sqlite_foreign_key.anubis + +read calexium_lib/database/db_utils.anubis +read calexium_lib/net_services_protocols/logger_service.anubis +transmit db_version.anubis + +public type DbTable: + table(String name, String create_query), + table(String db_name, String name, String create_query), + view(String name, String create_query). + + +public define Bool + is_table_exists + ( + SQLite3DataBase db, + String dbName, + String table_name + )= + if sql_query_timeout(db, "SELECT * FROM " + dbName + ".sqlite_master WHERE type ='table' AND tbl_name =:table_name", [bind_String(":table_name", table_name)], "is_table_exists("+table_name+")") is + { + error(_) then false, //error in the SQL request + ok(_, cursor, _) then + if cursor(unique) is + { + error(_) then false, + no_more_row then false, + row(current) then true + } + }. + +public define Bool + is_table_exists + ( + SQLite3DataBase db, + String table_name + )= + is_table_exists(db, "main", table_name). + +public define Bool + is_empty_database + ( + SQLite3DataBase db, + String dbName, + )= + if sql_query_timeout(db, "SELECT * FROM " + dbName + ".sqlite_master", [], "is_empty_database("+dbName+")") is + { + error(_) then true, //error in the SQL request + ok(_, cursor, _) then + if cursor(unique) is + { + error(_) then true, + no_more_row then true, + row(current) then false + } + }. + +public define Bool + is_empty_database + ( + SQLite3DataBase db, + )= + is_empty_database(db, "main"). + +public define Maybe(One) + drop_all_triggers + ( + SQLite3DataBase db, + Logger log + ) = + if sqlite3_query(db, "SELECT name FROM sqlite_master WHERE type = 'trigger'", []) is + { + error(err) then logError(log, db_error(err, "drop_all_triggers")); failure, + ok(_, cursor, _) then + with drop_trigger = (String name) |-> if sqlite3_query(db, "DROP TRIGGER " + name, []) is + { + error(err2) then logError(log, db_error(err2, "Failed to drop trigger '" + name + "'")), + ok(_, cursor, _) then unique + }, + map_forget(drop_trigger, db_get_string_list(cursor, [])); + success(unique) + }. + +public define Maybe(One) + create_tables + ( + SQLite3DataBase db, + Logger logger, + List(DbTable) tables, + String version_string + ) = + if tables is + { + [] then success(unique), + [h . t] then + if h is + { + table(table_name, create_string) then + if alter_table(db, table_name, create_string, logger) is + { + failure then logError(logger, "Version "+version_string+": Can't create '"+table_name+"' table"); failure, + success(_) then create_tables(db, logger, t, version_string) + }, + table(db_name, table_name, create_string) then + if alter_table(db, db_name, table_name, create_string, logger) is + { + failure then logError(logger, "Version "+version_string+": Can't create '"+db_name+"."+table_name+"' table"); failure, + success(_) then create_tables(db, logger, t, version_string) + }, + view(view_name, create_string) then + if alter_view(db, view_name, create_string, logger) is + { + failure then logError(logger, "Version "+version_string+": Can't create '"+view_name+"' view"); failure, + success(_) then create_tables(db, logger, t, version_string) + }, + } + }. + + +public define Maybe(One) + create_indexes + ( + SQLite3DataBase db, + Logger logger, + List(String) indexes, + String version_string + )= + if indexes is + { + [] then success(unique), + [h . t] then + if sql_query_timeout(db, h, [], "Version "+version_string+": create indexes") is + { + error(_) then failure, + ok(_,_,_) then create_indexes(db, logger, t, version_string) + } + }. + + +public define One + make_foreign_key + ( + SQLite3DataBase db, + String table_name, + String field_name, + String foreign_table_name, + String foreign_field_name, + Bool fk_null, + Bool fk_cascade, + Logger log + ) = + if (Maybe(One))make_foreign_key(db, table_name, field_name, foreign_table_name, foreign_field_name, fk_null, fk_cascade, log) is + { + failure then + logError(log, "Can't create foreign key constraint between '"+table_name+"' and '"+foreign_table_name+"' tables"), + success(_) then + unique + }. + +public define Maybe(One) + make_foreign_keys + ( + SQLite3DataBase db, + Logger logger, + List((String, String, String, String, FK_Null, FK_Cascade)) relations, + String version_string + )= + if relations is + { + [] then success(unique), + [h . t] then + if h is (table_name, field_name, foreign_table_name, foreign_field_name, fk_null, fk_cascade) then + if (Maybe(One))make_foreign_key(db, table_name, field_name, foreign_table_name, foreign_field_name, fk_null, fk_cascade, logger) is + { + failure then + logError(logger, "Version "+version_string+": Can't create foreign key constraint between '"+table_name+"' and '"+foreign_table_name+"' tables"); failure, + success(_) then + make_foreign_keys(db, logger, t, version_string) + } + }. diff --git a/database/migration_sqlite3.anubis b/database/migration_sqlite3.anubis index f92f049..1fd14cb 100644 --- a/database/migration_sqlite3.anubis +++ b/database/migration_sqlite3.anubis @@ -16,43 +16,60 @@ read calexium_lib/net_services_protocols/logger_service.anubis read migration_common_sqlite3.anubis +public type Migration: + migration(DB_Version version, + (SQLite3DataBase, Logger) -> Maybe(One) migrate_to, + (SQLite3DataBase, Logger) -> Maybe(One) create_tables, + (SQLite3DataBase, Logger) -> Maybe(One) create_indexes, + ). + define String dir_save_database = "/db_backup/". +public define Bool + migration_less + ( + Migration a, + Migration b + )= + db_version_less(a.version, b.version) +. + + /** * Compare two version string. Returns -1 if first is lower than second, 1 if first is greater than second, and 0 if equals. */ -public define Int - compare_db_version - ( - String version1, - String version2 - ) = - with compare = (List(String) v1, List(String) v2) |-compare-> (Int) - if v1 is - { - [] then - if v2 is - { - [] then 0, - [h2 . t2] then -1 - }, - [h1 . t1] then - if v2 is - { - [] then 1, - [h2 . t2] then - if h1 = h2 then compare(t1, t2) - else - with v1i = force_Type(decimal_scan(h1), 0), - v2i = force_Type(decimal_scan(h2), 0), - if v1i < v2i then -1 - else if v1i > v2i then 1 - else 0 - }, - }, - compare(split(version1, '.'), split(version2, '.')). +//public define Int +// compare_db_version +// ( +// String version1, +// String version2 +// ) = +// with compare = (List(String) v1, List(String) v2) |-compare-> (Int) +// if v1 is +// { +// [] then +// if v2 is +// { +// [] then 0, +// [h2 . t2] then -1 +// }, +// [h1 . t1] then +// if v2 is +// { +// [] then 1, +// [h2 . t2] then +// if h1 = h2 then compare(t1, t2) +// else +// with v1i = force_Type(decimal_scan(h1), 0), +// v2i = force_Type(decimal_scan(h2), 0), +// if v1i < v2i then -1 +// else if v1i > v2i then 1 +// else 0 +// }, +// }, +// compare(split(version1, '.'), split(version2, '.')). public define Maybe(One) backup_database @@ -107,155 +124,163 @@ public define Maybe(One) } //else success(unique) . - - - - - - -public type Migration: - migration(String version, - (SQLite3DataBase, Logger) -> Maybe(One) migrate_to, - (SQLite3DataBase, Logger) -> Maybe(One) create_tables, - (SQLite3DataBase, Logger) -> Maybe(One) create_indexes, - ). - - - -define Maybe(One) - do_migration_loop - ( - SQLite3DataBase db, - Logger logger, - String current_version, //current version of app - String db_ver, //version found in db settings - List(Migration) migrations, - Maybe(Migration) need_to_create_table, // success in case of new DB or when no migration have been done - (SQLite3DataBase, String) -> One update_db_version, - ) = - if migrations is - { - [] then - if need_to_create_table is - { - failure then - update_db_version(db, current_version); - success(unique), - success(last) then - if last is migration(_, _, create_tables, create_indexes) then - if create_tables(db, logger) is success(_) then - if create_indexes(db, logger) is success(_) then - update_db_version(db, current_version); - success(unique) - else - failure - else - failure - }, - [h . t] then - if h is migration(version, migrate_to, _, _) then - if compare_db_version(db_ver, version) < 0 then - logInfo(logger, "Migrating Database from version " + db_ver + " to version " + version); - if migrate_to(db, logger) is failure then - failure - else - do_migration_loop(db, logger, current_version, version, t, failure, update_db_version) - else - do_migration_loop(db, logger, current_version, db_ver, t, success(h), update_db_version), - }. +// +//define Maybe(One) +// do_migration_loop +// ( +// SQLite3DataBase db, +// Logger logger, +// String current_version, //current version of app +// String db_ver, //version found in db settings +// List(Migration) migrations, +// Maybe(Migration) need_to_create_table, // success in case of new DB or when no migration have been done +// (SQLite3DataBase, String) -> One update_db_version, +// ) = +// if migrations is +// { +// [] then +// if need_to_create_table is +// { +// failure then +// update_db_version(db, current_version); +// success(unique), +// success(last) then +// if last is migration(_, _, create_tables, create_indexes) then +// if create_tables(db, logger) is success(_) then +// if create_indexes(db, logger) is success(_) then +// update_db_version(db, current_version); +// success(unique) +// else +// failure +// else +// failure +// }, +// [h . t] then +// since h is migration(version, migrate_to, _, _), +// if compare_db_version(db_ver, version) < 0 then +// logInfo(logger, "Migrating Database from version " + db_ver + " to version " + version); +// if migrate_to(db, logger) is failure then +// failure +// else +// do_migration_loop(db, logger, current_version, version, t, failure, update_db_version) +// else +// do_migration_loop(db, logger, current_version, db_ver, t, success(h), update_db_version), +// }. +// +///* SQLite 3 version */ +//public define Maybe(One) +// do_migration +// ( +// SQLite3DataBase db, +// Logger logger, +// String current_version, +// (SQLite3DataBase) -> String get_db_version, +// (SQLite3DataBase, String) -> One update_db_version, +// List(Migration) all_migrations, +// )= +// if is_empty_database(db) then // new empty database +// logInfo(logger, "No database found. Creating a new one..."); +// do_migration_loop(db, logger, current_version, "", [], last(all_migrations), update_db_version) +// else +// ( +// with db_version = get_db_version(db), +// //if app required db version is same as db_version, there is nothing to migrate +// if compare_db_version(db_version, current_version) = 0 then +// logInfo(logger, "Database version "+db_version+". No database migration found."); +// success(unique) +// else +// do_migration_loop(db, logger, current_version, db_version, all_migrations, failure, update_db_version) +// ). +/* SQLite 3 version hk_settings with DB_Version*/ -/* SQLite 3 version */ -public define Maybe(One) - do_migration +define Maybe(One) + do_table_indexes ( - SQLite3DataBase db, - Logger logger, - String current_version, - (SQLite3DataBase) -> String get_db_version, - (SQLite3DataBase, String) -> One update_db_version, - List(Migration) all_migrations, + SQLite3DataBase db, + Logger logger, + Migration _migration, + (DB_Version) -> One update_db_version )= - if is_empty_database(db) then // new empty database - logInfo(logger, "No database found. Creating a new one..."); - do_migration_loop(db, logger, current_version, "", [], last(all_migrations), update_db_version) - else - ( - with db_version = get_db_version(db), - //if app version is same as db_version, there is nothing to migrate - if compare_db_version(db_version, current_version) = 0 then - logInfo(logger, "Database version "+db_version+". No database migration found."); + since _migration is migration(mig_version, _, create_tables, create_indexes), + + if create_tables(db, logger) is success(_) then + if create_indexes(db, logger) is success(_) then + update_db_version(mig_version); success(unique) else - do_migration_loop(db, logger, current_version, db_version, all_migrations, failure, update_db_version) - ). - -/* SQLite 3 version hk_settings*/ - + failure + else + failure +. + define Maybe(One) do_migration_loop ( SQLite3DataBase db, Logger logger, - String current_version, //current version of app - String db_ver, //version found in db settings +// String current_version, //current version of app + DB_Version db_ver, //version found in db settings List(Migration) migrations, - Maybe(Migration) need_to_create_table, // success in case of new DB or when no migration have been done - (String) -> One update_db_version, + (DB_Version) -> One update_db_version, ) = if migrations is { - [] then - if need_to_create_table is + [] then success(unique), + [h . t] then + since h is migration(migration_version, migrate_to, create_tables, create_indexes), + + if compare_db_version(db_ver, migration_version) is { - failure then - update_db_version(current_version); - success(unique), - success(last) then - if last is migration(_, _, create_tables, create_indexes) then - if create_tables(db, logger) is success(_) then - if create_indexes(db, logger) is success(_) then - update_db_version(current_version); - success(unique) - else - failure + less then + logInfo(logger, "Migrating Database from version " + db_ver + " to version " + migration_version); + if migrate_to(db, logger) is failure then + failure + else + do_migration_loop(db, logger, migration_version, t, update_db_version) + + more then + logInfo(logger, "No Database migration found from version " + db_ver + " to version " + migration_version); + do_migration_loop(db, logger, db_ver, t, update_db_version) + + equal then + logInfo(logger, "No Database migration found from version " + db_ver + " to version " + migration_version); + do_migration_loop(db, logger, db_ver, t, update_db_version) + + equal_but_sign then + logInfo(logger, "Database migration found from version " + db_ver + " to version " + migration_version+ " by hash difference "); + if do_table_indexes(db, logger, h, update_db_version) is success(_) then + do_migration_loop(db, logger, migration_version, t, update_db_version) else failure - }, - [h . t] then - if h is migration(version, migrate_to, _, _) then - if compare_db_version(db_ver, version) < 0 then - logInfo(logger, "Migrating Database from version " + db_ver + " to version " + version); - if migrate_to(db, logger) is failure then - failure - else - do_migration_loop(db, logger, current_version, version, t, failure, update_db_version) - else - do_migration_loop(db, logger, current_version, db_ver, t, success(h), update_db_version), + } }. public define Maybe(One) do_migration ( - SQLite3DataBase db, - Logger logger, - String current_version, - String get_db_version, - (String) -> One update_db_version, - List(Migration) all_migrations, + SQLite3DataBase db, + Logger logger, + DB_Version current_db_version, + (DB_Version) -> One update_db_version, + List(Migration) all_migrations, )= if is_empty_database(db) then // new empty database logInfo(logger, "No database found. Creating a new one..."); - do_migration_loop(db, logger, current_version, "", [], last(all_migrations), update_db_version) + if last(all_migrations) is success(migration) then + do_table_indexes(db, logger, migration, update_db_version) + else + logError(logger, "No database migration found. Can't create Database"); + failure else ( - with db_version = get_db_version, - //if app version is same as db_version, there is nothing to migrate - if compare_db_version(db_version, current_version) = 0 then - logInfo(logger, "Database version "+db_version+". No database migration found."); - success(unique) - else - do_migration_loop(db, logger, current_version, db_version, all_migrations, failure, update_db_version) +// with db_version = get_db_version, +// //if app version is same as db_version, there is nothing to migrate +// if compare_db_version(db_version, current_version) = 0 then +// logInfo(logger, "Database version "+db_version+". No database migration found."); +// success(unique) +// else + do_migration_loop(db, logger, current_db_version, all_migrations, update_db_version) ). public define Maybe(One) @@ -263,7 +288,7 @@ public define Maybe(One) ( SQLite3DataBase db, Logger logger, - String current_version, + //String current_version, List(Migration) all_migrations, )= if last(all_migrations) is diff --git a/database/settings.anubis b/database/settings.anubis index da99e7e..3fc4e5a 100644 --- a/database/settings.anubis +++ b/database/settings.anubis @@ -17,9 +17,9 @@ public define Maybe(String) Database db, String var, )= - if sql_query_timeout(db, "SELECT var_value FROM settings WHERE var_name=" + db_make_sql_string(var) + ";", "select_settings") is + if sql_query_timeout(db, "SELECT var_value FROM settings WHERE var_name=:var_name;", [bind_String(":var_name",var)], "select_settings") is { - failure then failure, //error in the SQL request + failure then failure, //error in the SQL request success(table_cursor) then if table_cursor(unique) is { @@ -33,30 +33,30 @@ public define String select_settings ( Database db, - String var, - String default + String var, + String default )= if select_settings(db, var) is { - failure then default, //error in the SQL request - success(value) then value + failure then default, //error in the SQL request + success(value) then value }. public define Int select_settings ( Database db, - String var, - Int default + String var, + Int default )= if select_settings(db, var) is { - failure then default, //error in the SQL request - success(value) then + failure then default, //error in the SQL request + success(value) then if decimal_scan(value) is { - failure then default, - success(v) then v + failure then default, + success(v) then v } }. @@ -69,12 +69,12 @@ public define Bool )= if select_settings(db, var) is { - failure then default, //error in the SQL request - success(value) then + failure then default, //error in the SQL request + success(value) then if decimal_scan(value) is { - failure then default, - success(v) then v!=0 + failure then default, + success(v) then v!=0 } }. diff --git a/database/types/db_migration.anubis b/database/types/db_migration.anubis new file mode 100644 index 0000000..49a7d6d --- /dev/null +++ b/database/types/db_migration.anubis @@ -0,0 +1,15 @@ +/* + * Created by PyramIDE. + * User: フランスのトトロ aka (David RENÉ) + * Date: 09/07/2017 + * Time: 00:25 + * © Calexium + */ + + +public type DB_Version: + db_version( + String version, //in form A.B.C.D usually the version of the application + String sha1 //the SHA1 of the db definition, schema etc... + ) +. diff --git a/types/version.anubis b/types/version.anubis new file mode 100644 index 0000000..94701ba --- /dev/null +++ b/types/version.anubis @@ -0,0 +1,105 @@ +/* + * Created by PyramIDE. + * User: フランスのトトロ aka (David RENÉ) + * Date: 09/07/2017 + * Time: 00:39 + * © Calexium + */ + +transmit tools/basis.anubis +transmit system/string.anubis + +public type Version: + version( + Word32 numeric, + + ) +. + +public define Version + version( + Word8 a, + Word8 b, + Word8 c, + Word8 d + )= + + version( word32(word16(d, c), word16(b, a))) +. + + +define Maybe(Version) + convert_digits_to_Version + ( + List(String) digits, + Int current, + Word32 value + )= + if digits is + { + [] then success(version(value)), + [h . t] then + if length(h) = 0 then + convert_digits_to_Version(t, current -1, value) + else + if decimal_scan(h) is + { + failure then failure, + success(v) then + if v > 255 then //the value is greater than Word8 capacity + failure + else + with value = value | ((v&0xFF)<< (current * 8)), + if current = 0 then + success(version(value)) + else + convert_digits_to_Version(t, current -1, value) + } + }. + + + /** convert a version string into Word32 value + * The version string, is made up of 4 values separated by period. + * At this time, these values musn't be higher than 255 because, each value are + * concatenated into Word32. Then each word8 is a part of final value the most significant + * value will be placed into most significant place into Word32 + * for example + * String Word32 Representation + * 2.5 [ 2 | 5 | 0 | 0 ] + * 1.34.2.165 [ 1 | 43 | 2 | 165 ] + * + */ + +public define Maybe(Version) + to_Version + ( + String ver_string + )= + with list_digits = split_by_token(ver_string, '.'), + if length(list_digits) > 4 then + failure + else + convert_digits_to_Version(list_digits, 3, 0). + + +public define String + to_String + ( + Version _version + ) = + since _version is version(numeric), + (numeric >> 24) + "." + + ((numeric >> 16) & 0xFF) + "." + + ((numeric >> 8) & 0xFF) + "." + + (numeric & 0xFF) +. + +public define String + String s + Version v = + s + to_String(v) +. + +public define String + Version v + String s = + to_String(v) + s +. -- libgit2 0.21.4