def objc_wrapper_from_cpp_parameter(self):
     if self.var_type == VarType.cpp_object_array:
         return 'std::vector<std::unique_ptr<lesschat::{0}>> core{1}'.format(
             self.var_type.object_class_name,
             string_utils.to_title_style_name(self.name))
     elif self.var_type == VarType.cpp_object:
         return 'std::unique_ptr<lesschat::{0}> core{0}'.format(
             self.var_type.object_class_name,
             string_utils.to_title_style_name(self.name))
     else:
         return '{0} {1}'.format(self.var_type.to_getter_string(),
                                 self.name)
示例#2
0
    def __save_implementation(self, save_command):
        if save_command.is_plural:
            impl = ''
            if save_command.alias_or_none is None:
                impl += 'void {0}::Save{3}ToCache(const std::vector<std::unique_ptr<{1}>>& {2}) const {{\n'\
                    .format(self.manager_name, self.object_name, self.plural_object_name.lower(), self.plural_object_name)
            else:
                impl += 'void {0}::{3}(const std::vector<std::unique_ptr<{1}>>& {2}) const {{\n'\
                    .format(self.manager_name, self.object_name, self.plural_object_name.lower(), save_command.alias_or_none)
            impl += '  LockMainDatabase();\n\n  BeginTransaction();' + _CPP_BR
            impl += '  for (auto it = {0}.begin(); it != {0}.end(); ++it) {{\n'.format(
                self.plural_object_name.lower())

            if len(save_command.table_name_list) == 0:
                impl += '    UnsafeSave{0}ToCache(**it);\n'.format(
                    self.object_name)
            else:
                for table_name in save_command.table_name_list:
                    if table_name == self.plural_object_name:
                        impl += '    UnsafeSave{0}ToCache(**it);\n'.format(
                            self.object_name)
                    else:
                        impl += '    UnsafeSave{0}To{1}(**it);\n'.format(
                            self.object_name,
                            string_utils.to_title_style_name(table_name))

            impl += '  }\n\n'
            impl += '  CommitTransaction();\n\n  UnlockMainDatabase();\n'
            impl += '}'
            return impl
        else:
            impl = 'void {0}::Save{1}ToCache(const {1}& {2}) const {{\n'.format(
                self.manager_name, self.object_name, self.object_name.lower())
            impl += '  LockMainDatabase();' + _CPP_BR

            if len(save_command.table_name_list) == 0:
                impl += '  UnsafeSave{0}ToCache({1});'.format(
                    self.object_name, self.object_name.lower()) + _CPP_BR
            else:
                for table_name in save_command.table_name_list:
                    if table_name == self.plural_object_name.lower():
                        impl += '  UnsafeSave{0}ToCache({1});'.format(
                            self.object_name,
                            self.object_name.lower()) + _CPP_BR
                    else:
                        impl += '  UnsafeSave{0}To{2}({1});'.format(
                            self.object_name, self.object_name.lower(),
                            string_utils.to_title_style_name(
                                table_name)) + _CPP_BR

            impl += '  UnlockMainDatabase();\n'
            impl += '}'
            return impl
示例#3
0
 def objc_wrapper_from_cpp_parameter(self, config):
     """From std::vector<std::unique_ptr<Calendar>> to std::vector<std::unique_ptr<lesschat::Calendar>>, (Array also is)
     """
     if self.var_type == VarType.cpp_object_array:
         return 'std::vector<std::unique_ptr<{2}::{0}>> core{1}'\
             .format(self.var_type.object_class_name,
                     string_utils.to_title_style_name(self.name),
                     config.cpp_namespace)
     elif self.var_type == VarType.cpp_object:
         return 'std::unique_ptr<{1}::{0}> core{0}'\
             .format(self.var_type.object_class_name,
                     string_utils.to_title_style_name(self.name),
                     config.cpp_namespace)
     else:
         return '{0} {1}'.format(self.var_type.to_getter_string(), self.name)
示例#4
0
 def objc_wrapper_from_cpp_parameter(self, config):
     """From std::vector<std::unique_ptr<Calendar>> to std::vector<std::unique_ptr<lesschat::Calendar>>, (Array also is)
     """
     if self.var_type == VarType.cpp_object_array:
         return 'std::vector<std::unique_ptr<{2}::{0}>> core{1}'\
             .format(self.var_type.object_class_name,
                     string_utils.to_title_style_name(self.name),
                     config.cpp_namespace)
     elif self.var_type == VarType.cpp_object:
         return 'std::unique_ptr<{1}::{0}> core{0}'\
             .format(self.var_type.object_class_name,
                     string_utils.to_title_style_name(self.name),
                     config.cpp_namespace)
     else:
         return '{0} {1}'.format(self.var_type.to_getter_string(),
                                 self.name)
示例#5
0
 def unsafe_save_declaration(self, pre_spaces, table_name=''):
     """Returns 'UnsafeSaveObjectToCache' or 'UnsafeSaveObjectToTable' declaration"""
     if table_name == '':
         return '{2}void UnsafeSave{0}ToCache(const {0}& {1}) const;\n\n'\
             .format(self.object_name, self.object_name.lower(), pre_spaces)
     else:
         return '{2}void UnsafeSave{0}To{3}(const {0}& {1}) const;\n\n'\
             .format(self.object_name, self.object_name.lower(), pre_spaces, string_utils.to_title_style_name(table_name))
 def unsafe_save_declaration(self, pre_spaces, table_name=''):
     """Returns 'UnsafeSaveObjectToCache' or 'UnsafeSaveObjectToTable' declaration"""
     if table_name == '':
         return '{2}void UnsafeSave{0}ToCache(const {0}& {1}) const;\n\n'\
             .format(self.object_name, self.object_name.lower(), pre_spaces)
     else:
         return '{2}void UnsafeSave{0}To{3}(const {0}& {1}) const;\n\n'\
             .format(self.object_name, self.object_name.lower(), pre_spaces, string_utils.to_title_style_name(table_name))
 def getter_method_name(self):
     title_style_name = string_utils.to_title_style_name(self.name)
     if self.var_type == VarType.cpp_bool:
         method_name = 'JNIEXPORT {0} JNICALL Java_com_lesschat_core_{1}_{2}_nativeIs{3}'.\
             format(self.var_type.to_jni_getter_string(), self.group_name, self.class_name, title_style_name)
         return method_name
     else:
         method_name = 'JNIEXPORT {0} JNICALL Java_com_lesschat_core_{1}_{2}_nativeGet{3}'.\
             format(self.var_type.to_jni_getter_string(), self.group_name, self.class_name,  title_style_name)
         return method_name
示例#8
0
 def __getter_method_name(self):
     title_style_name = string_utils.to_title_style_name(self.__name)
     if self.__var_type == VarType.cpp_bool:
         method_name = 'JNIEXPORT {0} JNICALL Java_com_lesschat_core_{1}_{2}_nativeIs{3}'. \
             format(self.__var_type.to_jni_getter_string(), self.__group_name, self.__class_name, title_style_name)
         return method_name
     else:
         method_name = 'JNIEXPORT {0} JNICALL Java_com_lesschat_core_{1}_{2}_nativeGet{3}'. \
             format(self.__var_type.to_jni_getter_string(), self.__group_name, self.__class_name, title_style_name)
         return method_name
 def sqlite_record_by_object_declaration(self, table_name=''):
     """Returns 'sql::Record RecordByObject(const Object& obj) const;' (if table_name is empty)
         or
         'sql::Record RecordByTaskFromTable(const Task& task) const; declaration'
     """
     if table_name == '':
         return 'sql::Record RecordBy{0}(const {0}& {1}) const;'\
             .format(self.object_name, self.object_name.lower())
     else:
         return 'sql::Record RecordBy{0}From{2}(const {0}& {1}) const;'\
             .format(self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name))
示例#10
0
 def sqlite_record_by_object_declaration(self, table_name=''):
     """Returns 'sql::Record RecordByObject(const Object& obj) const;' (if table_name is empty)
         or
         'sql::Record RecordByTaskFromTable(const Task& task) const; declaration'
     """
     if table_name == '':
         return 'sql::Record RecordBy{0}(const {0}& {1}) const;'\
             .format(self.object_name, self.object_name.lower())
     else:
         return 'sql::Record RecordBy{0}From{2}(const {0}& {1}) const;'\
             .format(self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name))
    def jni_var_assignment_by_cpp_variable(self, config):
        """Returns a method which is a JNI filed converted from C++.

        Returns:
            For example:

            jstring jFileId = lesschat::JniHelper::JstringFromString(file.file_id());
        """
        jtype = self.__var_type.to_jni_getter_string()
        jname = 'j{0}'.format(string_utils.to_title_style_name(self.__name))
        return '{0} {1} = {2};'.format(jtype, jname, self.__jni_variable_from_cpp_class(config))
示例#12
0
    def jni_var_assignment_by_cpp_variable(self, config):
        """Returns a method which is a JNI filed converted from C++.

        Returns:
            For example:

            jstring jFileId = lesschat::JniHelper::JstringFromString(file.file_id());
        """
        jtype = self.__var_type.to_jni_getter_string()
        jname = 'j{0}'.format(string_utils.to_title_style_name(self.__name))
        return '{0} {1} = {2};'.format(jtype, jname, self.__jni_variable_from_cpp_class(config))
    def __jni_get_jobject_by_core_object_implementation(self, config):
        impl = 'jobject JniHelper::GetJ{0}ByCore{0}(const {0}& {1}) {{\n'.format(
            self.__class_name, string_utils.cpp_class_name_to_cpp_file_name(self.__class_name))
        impl += indent(2) + 'JNIEnv* env = GetJniEnv();\n'
        impl += indent(2) + 'if (!env) {\n'
        impl += indent(4) + 'sakura::log_error("Failed to get JNIEnv");\n'
        impl += indent(4) + 'return nullptr;\n'
        impl += indent(2) + '}\n\n'
        impl += indent(2) + 'jclass {0}Jclass = JniReferenceCache::SharedCache()->{1}_jclass();\n'.format(
            string_utils.first_char_to_lower(self.__class_name),
            string_utils.cpp_class_name_to_cpp_file_name(self.__class_name))
        impl += indent(2) + 'jmethodID {0}ConstructorMethodID = env->GetMethodID({0}Jclass, "<init>", "('.format(
            string_utils.first_char_to_lower(self.__class_name))
        for jni_var in self.__jni_var_list:
            impl += jni_var.var_type.to_jni_signature()
        impl += ')V");\n\n'

        for jni_var in self.__jni_var_list:
            impl += indent(2) + jni_var.jni_var_assignment_by_cpp_variable(config) + '\n'

        impl += '\n'

        constructor_fst_line = indent(2) + 'jobject j{0}Object = env->NewObject('.format(self.__class_name)
        num_constructor_indent = len(constructor_fst_line)

        impl += constructor_fst_line

        parameters = []
        jclass_instance_name = '{0}Jclass'.format(string_utils.first_char_to_lower(self.__class_name))
        constructor_method_id = '{0}ConstructorMethodID'.format(string_utils.first_char_to_lower(self.__class_name))
        parameters.append(constructor_method_id)
        for jni_var in self.__jni_var_list:
            parameters.append('j{0}'.format(string_utils.to_title_style_name(jni_var.name)))

        impl += jclass_instance_name + ',\n'
        for parameter in parameters:
            impl += indent(num_constructor_indent) + parameter + ',\n'
        impl = impl[:-2]
        impl += ');'
        impl += '\n'

        for jni_var in self.__jni_var_list:
            delete_method = jni_var.jni_delete_local_ref()
            if delete_method != '':
                impl += indent(2) + delete_method + '\n'
        impl += '\n'

        impl += indent(2) + 'return j{0}Object;'.format(self.__class_name)
        impl += '\n'
        impl += '}\n'
        impl += '\n'
        return impl
示例#14
0
    def __jni_get_jobject_by_core_object_implementation(self, config):
        impl = 'jobject JniHelper::GetJ{0}ByCore{0}(const {0}& {1}) {{\n'.format(
            self.__class_name, string_utils.cpp_class_name_to_cpp_file_name(self.__class_name))
        impl += indent(2) + 'JNIEnv* env = GetJniEnv();\n'
        impl += indent(2) + 'if (!env) {\n'
        impl += indent(4) + 'sakura::log_error("Failed to get JNIEnv");\n'
        impl += indent(4) + 'return nullptr;\n'
        impl += indent(2) + '}\n\n'
        impl += indent(2) + 'jclass {0}Jclass = JniReferenceCache::SharedCache()->{1}_jclass();\n'.format(
            string_utils.first_char_to_lower(self.__class_name),
            string_utils.cpp_class_name_to_cpp_file_name(self.__class_name))
        impl += indent(2) + 'jmethodID {0}ConstructorMethodID = env->GetMethodID({0}Jclass, "<init>", "('.format(
            string_utils.first_char_to_lower(self.__class_name))
        for jni_var in self.__jni_var_list:
            impl += jni_var.var_type.to_jni_signature()
        impl += ')V");\n\n'

        for jni_var in self.__jni_var_list:
            impl += indent(2) + jni_var.jni_var_assignment_by_cpp_variable(config) + '\n'

        impl += '\n'

        constructor_fst_line = indent(2) + 'jobject j{0}Object = env->NewObject('.format(self.__class_name)
        num_constructor_indent = len(constructor_fst_line)

        impl += constructor_fst_line

        parameters = []
        jclass_instance_name = '{0}Jclass'.format(string_utils.first_char_to_lower(self.__class_name))
        constructor_method_id = '{0}ConstructorMethodID'.format(string_utils.first_char_to_lower(self.__class_name))
        parameters.append(constructor_method_id)
        for jni_var in self.__jni_var_list:
            parameters.append('j{0}'.format(string_utils.to_title_style_name(jni_var.name)))

        impl += jclass_instance_name + ',\n'
        for parameter in parameters:
            impl += indent(num_constructor_indent) + parameter + ',\n'
        impl = impl[:-2]
        impl += ');'
        impl += '\n'

        for jni_var in self.__jni_var_list:
            delete_method = jni_var.jni_delete_local_ref()
            if delete_method != '':
                impl += indent(2) + delete_method + '\n'
        impl += '\n'

        impl += indent(2) + 'return j{0}Object;'.format(self.__class_name)
        impl += '\n'
        impl += '}\n'
        impl += '\n'
        return impl
示例#15
0
    def __init__(self, name, var_type_string):
        """Init JavaVariable with name and type string declares in VarType.

        Args:
            name: A string descries Variable name.
            var_type_string: A string declares in VarType.
        """
        var_type = VarType.instance_from_string(var_type_string)

        self.__name_str = to_objc_property_name(name)
        self.__title_style_name = to_title_style_name(name)
        self.__var_type = var_type
        self.__java_enum = ''
示例#16
0
    def jni_delete_local_ref(self):
        """Gets JNI delete local ref method.

        Returns:
            A string which is JNI delete local ref method.
        """
        if self.__var_type == VarType.cpp_string or self.__var_type == VarType.cpp_string_array:
            return 'env->DeleteLocalRef(j{0});'.format(string_utils.to_title_style_name(self.__name))
        elif self.__var_type == VarType.cpp_object or self.__var_type == VarType.cpp_object_array:
            skr_logger.skr_log_warning('JniVariable.jni_delete_local_ref() : Not supported type')
            return 'env->DeleteLocalRef(j{0});'.format(string_utils.first_char_to_upper(self.__name))
        else:
            return ''
    def jni_delete_local_ref(self):
        """Gets JNI delete local ref method.

        Returns:
            A string which is JNI delete local ref method.
        """
        if self.__var_type == VarType.cpp_string or self.__var_type == VarType.cpp_string_array:
            return 'env->DeleteLocalRef(j{0});'.format(string_utils.to_title_style_name(self.__name))
        elif self.__var_type == VarType.cpp_object or self.__var_type == VarType.cpp_object_array:
            skr_logger.skr_log_warning('JniVariable.jni_delete_local_ref() : Not supported type')
            return 'env->DeleteLocalRef(j{0});'.format(string_utils.first_char_to_upper(self.__name))
        else:
            return ''
    def __init__(self, name, var_type_string):
        """Init JavaVariable with name and type string declares in VarType.

        Args:
            name: A string descries Variable name.
            var_type_string: A string declares in VarType.
        """
        var_type = VarType.instance_from_string(var_type_string)

        self.__name_str = to_objc_property_name(name)
        self.__title_style_name = to_title_style_name(name)
        self.__var_type = var_type
        self.__java_enum = ''
示例#19
0
 def unsafe_save_implementation(self, table_name=''):
     """Returns 'UnsafeSaveObjectToCache' or 'UnsafeSaveObjectToTable' implementation"""
     impl = ''
     if table_name == '':
         impl += 'void {0}::UnsafeSave{1}ToCache(const {1}& {2}) const {{\n'\
             .format(self.manager_name, self.object_name, self.object_name.lower())
         impl += _CPP_SPACE + 'sql::Record record = RecordBy{0}({1});\n'.format(
             self.object_name, self.object_name.lower())
     else:
         impl += 'void {0}::UnsafeSave{1}To{3}(const {1}& {2}) const {{\n'\
             .format(self.manager_name, self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name))
         impl += _CPP_SPACE + 'sql::Record record = RecordBy{0}From{2}({1});\n'.format(
             self.object_name, self.object_name.lower(),
             string_utils.to_title_style_name(table_name))
     impl += _CPP_SPACE + '{0}->addOrReplaceRecord(&record);\n'.format(
         self.__sqlite_tb_name(table_name))
     impl += '}'
     return impl
 def to_title_style_name(self):
     return string_utils.to_title_style_name(self.name)
示例#21
0
    def sqlite_record_by_object_implementation(self, table_name=''):
        """Returns 'sql::Record RecordByObject(const Object& obj) const;' (if table_name is empty)
            or
            'sql::Record RecordByTaskFromTable(const Task& task) const; implementation'
        """
        impl = ''
        if table_name == '':
            impl += 'sql::Record {0}::RecordBy{1}(const {1}& {2}) const {{\n'\
                .format(self.manager_name, self.object_name, self.object_name.lower())
            impl += _CPP_SPACE + 'sql::Record record({0}->fields());\n\n'.format(
                self.__sqlite_tb_name())
        else:
            impl += 'sql::Record {0}::RecordBy{1}From{3}(const {1}& {2}) const {{\n'\
                .format(self.manager_name, self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name))
            impl += _CPP_SPACE + 'sql::Record record({0}->fields());\n\n'.format(
                self.__sqlite_tb_name(table_name))

        for cpp_var in self.cpp_variable_list:
            impl += _CPP_SPACE
            impl += cpp_var.to_set_sql_string(self.object_name.lower())

        impl += '\n'
        impl += _CPP_SPACE
        impl += 'return record;\n'
        impl += '}'
        return impl
 def objc_wrapper_from_cpp_parameter(self):
     if self.var_type == VarType.cpp_object_array:
         return 'std::vector<std::unique_ptr<lesschat::{0}>> core{1}'.format(self.var_type.object_class_name, string_utils.to_title_style_name(self.name))
     elif self.var_type == VarType.cpp_object:
         return 'std::unique_ptr<lesschat::{0}> core{0}'.format(self.var_type.object_class_name, string_utils.to_title_style_name(self.name))
     else:
         return '{0} {1}'.format(self.var_type.to_getter_string(), self.name)
 def to_title_style_name(self):
     return string_utils.to_title_style_name(self.__name)
    def __cpp_cache_by_cache_description_name(self, cache_desc, name=''):
        cache_attr = cache_desc

        if cache_attr is None or cache_attr == '':  # if no 'cache'
            return ''

        impl = ''
        caches = re.split(',', cache_attr)
        for cache in caches:
            if cache[0] == '#':  # if define
                impl += string_utils.indent(6) + self.__find_replace_string_by_name(cache[1:]) + '\n'
            else:  # if by command
                cpp_class = 'this->'
                method = ''

                # command_components[0]: save(s)/delete(s)/update(s)
                # command_components[1]: (id, project_id) - replace string
                command_components = re.split('\(', cache)
                sql_verb = command_components[0]
                parameters = ''
                num_parameters = 0
                if len(command_components) == 2:
                    parameters = command_components[1]
                    parameters = parameters[:-1]
                    num_parameters = len(re.split(',', parameters))
                else:
                    parameters = name
                    num_parameters = 0

                if sql_verb == 'saves':
                    method = 'Save{0}ToCache({1});\n'.format(self.plural_object_name, name)
                elif sql_verb == 'save':
                    method = 'Save{0}ToCache(*{1});\n'.format(self.object_name, name)
                elif sql_verb == 'deletes':
                    if num_parameters == 0:
                        method = 'Delete{0}FromCache();\n'.format(self.plural_object_name)
                    elif num_parameters == 1:
                        by = 'by_{0}'.format(parameters)
                        by = string_utils.to_title_style_name(by)
                        method = 'Delete{0}FromCache{2}({1});\n'.format(self.plural_object_name, parameters, by)
                    else:
                        method = 'Delete{0}FromCache({1});\n'.format(self.plural_object_name, parameters)
                elif sql_verb == 'delete':
                    if num_parameters == 0:
                        method = 'Delete{0}FromCache();\n'.format(self.object_name)
                    elif num_parameters == 1:
                        by = 'by_{0}'.format(parameters)
                        by = string_utils.to_title_style_name(by)
                        method = 'Delete{0}FromCache{2}({1});\n'.format(self.object_name, parameters, by)
                    else:
                        method = 'Delete{0}FromCache({1});\n'.format(self.object_name, parameters)
                elif sql_verb[:7] == 'fupdate':  # generate implementation automatically
                    components = re.split(':', sql_verb)
                    fetch_by_id = components[1]
                    impl = string_utils.indent(6) + 'unique_ptr<{0}> {1} = this->Fetch{0}FromCacheBy{2}({3});\n'\
                        .format(self.object_name,
                                string_utils.cpp_class_name_to_cpp_file_name(self.object_name),
                                string_utils.to_title_style_name(fetch_by_id),
                                fetch_by_id)

                    for parameter in re.split(',', parameters):
                        impl += string_utils.indent(6) + '{0}->set_{1}({1});\n'.format(string_utils.cpp_class_name_to_cpp_file_name(self.object_name), parameter)

                    impl += string_utils.indent(6) + 'this->Save{0}ToCache(*{1});\n'.format(self.object_name, string_utils.cpp_class_name_to_cpp_file_name(self.object_name))
                    return impl
                else:
                    print 'Unsupported method'
                    assert False
                impl += string_utils.indent(6) + cpp_class + method

        return impl
示例#25
0
    def __cpp_cache_by_cache_description_name(self,
                                              cache_desc,
                                              name='',
                                              indent=6):
        cache_attr = cache_desc

        if cache_attr is None or cache_attr == '':  # if no 'cache'
            return ''

        impl = ''
        caches = re.split(',', cache_attr)
        for cache in caches:
            if cache[0] == '#':  # if define
                impl += string_utils.indent(
                    indent) + self.__find_replace_string_by_name(
                        cache[1:]) + '\n'
            else:  # if by command
                cpp_class = 'this->'
                method = ''

                # command_components[0]: save(s)/delete(s)/update(s)
                # command_components[1]: (id, project_id) - replace string
                command_components = re.split('\(', cache)
                sql_verb = command_components[0]
                parameters = ''
                num_parameters = 0
                if len(command_components) == 2:
                    parameters = command_components[1]
                    parameters = parameters[:-1]
                    num_parameters = len(re.split(',', parameters))
                else:
                    parameters = name
                    num_parameters = 0

                if sql_verb == 'saves':
                    method = 'Save{0}ToCache({1});\n'.format(
                        self.plural_object_name, name)
                elif sql_verb == 'save':
                    method = 'Save{0}ToCache(*{1});\n'.format(
                        self.object_name, name)
                elif sql_verb == 'deletes':
                    if num_parameters == 0:
                        method = 'Delete{0}FromCache();\n'.format(
                            self.plural_object_name)
                    elif num_parameters == 1:
                        by = 'by_{0}'.format(parameters)
                        by = string_utils.to_title_style_name(by)
                        method = 'Delete{0}FromCache{2}({1});\n'.format(
                            self.plural_object_name, parameters, by)
                    else:
                        method = 'Delete{0}FromCache({1});\n'.format(
                            self.plural_object_name, parameters)
                elif sql_verb == 'delete':
                    if num_parameters == 0:
                        method = 'Delete{0}FromCache();\n'.format(
                            self.object_name)
                    elif num_parameters == 1:
                        by = 'by_{0}'.format(parameters)
                        by = string_utils.to_title_style_name(by)
                        method = 'Delete{0}FromCache{2}({1});\n'.format(
                            self.object_name, parameters, by)
                    else:
                        method = 'Delete{0}FromCache({1});\n'.format(
                            self.object_name, parameters)
                elif sql_verb[:
                              7] == 'fupdate':  # generate implementation automatically
                    components = re.split(':', sql_verb)
                    fetch_by_id = components[1]
                    impl = string_utils.indent(indent) + 'unique_ptr<{0}> {1} = this->Fetch{0}FromCacheBy{2}({3});\n'\
                        .format(self.object_name,
                                string_utils.cpp_class_name_to_cpp_file_name(self.object_name),
                                string_utils.to_title_style_name(fetch_by_id),
                                fetch_by_id)

                    for parameter in re.split(',', parameters):
                        impl += string_utils.indent(
                            indent) + '{0}->set_{1}({1});\n'.format(
                                string_utils.cpp_class_name_to_cpp_file_name(
                                    self.object_name), parameter)

                    impl += string_utils.indent(
                        indent) + 'this->Save{0}ToCache(*{1});\n'.format(
                            self.object_name,
                            string_utils.cpp_class_name_to_cpp_file_name(
                                self.object_name))
                    return impl
                else:
                    print 'Unsupported method'
                    assert False
                impl += string_utils.indent(indent) + cpp_class + method

        return impl
    def sqlite_record_by_object_implementation(self, table_name=''):
        """Returns 'sql::Record RecordByObject(const Object& obj) const;' (if table_name is empty)
            or
            'sql::Record RecordByTaskFromTable(const Task& task) const; implementation'
        """
        impl = ''
        if table_name == '':
            impl += 'sql::Record {0}::RecordBy{1}(const {1}& {2}) const {{\n'\
                .format(self.manager_name, self.object_name, self.object_name.lower())
            impl += _CPP_SPACE + 'sql::Record record({0}->fields());\n\n'.format(self.__sqlite_tb_name())
        else:
            impl += 'sql::Record {0}::RecordBy{1}From{3}(const {1}& {2}) const {{\n'\
                .format(self.manager_name, self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name))
            impl += _CPP_SPACE + 'sql::Record record({0}->fields());\n\n'.format(self.__sqlite_tb_name(table_name))

        for cpp_var in self.cpp_variable_list:
            impl += _CPP_SPACE
            impl += cpp_var.to_set_sql_string(self.object_name.lower())

        impl += '\n'
        impl += _CPP_SPACE
        impl += 'return record;\n'
        impl += '}'
        return impl
示例#27
0
 def to_title_style_name(self):
     """From 'display_name' to 'DisplayName'.
     """
     return string_utils.to_title_style_name(self.__name)
 def unsafe_save_implementation(self, table_name=''):
     """Returns 'UnsafeSaveObjectToCache' or 'UnsafeSaveObjectToTable' implementation"""
     impl = ''
     if table_name == '':
         impl += 'void {0}::UnsafeSave{1}ToCache(const {1}& {2}) const {{\n'\
             .format(self.manager_name, self.object_name, self.object_name.lower())
         impl += _CPP_SPACE + 'sql::Record record = RecordBy{0}({1});\n'.format(self.object_name, self.object_name.lower())
     else:
         impl += 'void {0}::UnsafeSave{1}To{3}(const {1}& {2}) const {{\n'\
             .format(self.manager_name, self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name))
         impl += _CPP_SPACE + 'sql::Record record = RecordBy{0}From{2}({1});\n'.format(self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name))
     impl += _CPP_SPACE + '{0}->addOrReplaceRecord(&record);\n'.format(self.__sqlite_tb_name(table_name))
     impl += '}'
     return impl
示例#29
0
 def to_title_style_name(self):
     """From 'display_name' to 'DisplayName'
     """
     return string_utils.to_title_style_name(self.name)
    def __save_implementation(self, save_command):
        if save_command.is_plural:
            impl = ''
            if save_command.alias_or_none is None:
                impl += 'void {0}::Save{3}ToCache(const std::vector<std::unique_ptr<{1}>>& {2}) const {{\n'\
                    .format(self.manager_name, self.object_name, self.plural_object_name.lower(), self.plural_object_name)
            else:
                impl += 'void {0}::{3}(const std::vector<std::unique_ptr<{1}>>& {2}) const {{\n'\
                    .format(self.manager_name, self.object_name, self.plural_object_name.lower(), save_command.alias_or_none)
            impl += '  LockMainDatabase();\n\n  BeginTransaction();' + _CPP_BR
            impl += '  for (auto it = {0}.begin(); it != {0}.end(); ++it) {{\n'.format(self.plural_object_name.lower())

            if len(save_command.table_name_list) == 0:
                impl += '    UnsafeSave{0}ToCache(**it);\n'.format(self.object_name)
            else:
                for table_name in save_command.table_name_list:
                    if table_name == self.plural_object_name:
                        impl += '    UnsafeSave{0}ToCache(**it);\n'.format(self.object_name)
                    else:
                        impl += '    UnsafeSave{0}To{1}(**it);\n'.format(self.object_name, string_utils.to_title_style_name(table_name))

            impl += '  }\n\n'
            impl += '  CommitTransaction();\n\n  UnlockMainDatabase();\n'
            impl += '}'
            return impl
        else:
            impl = 'void {0}::Save{1}ToCache(const {1}& {2}) const {{\n'.format(self.manager_name, self.object_name, self.object_name.lower())
            impl += '  LockMainDatabase();' + _CPP_BR

            if len(save_command.table_name_list) == 0:
                impl += '  UnsafeSave{0}ToCache({1});'.format(self.object_name, self.object_name.lower()) + _CPP_BR
            else:
                for table_name in save_command.table_name_list:
                    if table_name == self.plural_object_name.lower():
                        impl += '  UnsafeSave{0}ToCache({1});'.format(self.object_name, self.object_name.lower()) + _CPP_BR
                    else:
                        impl += '  UnsafeSave{0}To{2}({1});'.format(self.object_name, self.object_name.lower(), string_utils.to_title_style_name(table_name)) + _CPP_BR

            impl += '  UnlockMainDatabase();\n'
            impl += '}'
            return impl