lafcadio 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/lafcadio.rb +32 -0
- data/lib/lafcadio.rb~ +32 -0
- data/lib/lafcadio/TestSuite.rb +16 -0
- data/lib/lafcadio/dateTime.rb +2 -0
- data/lib/lafcadio/dateTime/Month.rb +93 -0
- data/lib/lafcadio/domain.rb +119 -0
- data/lib/lafcadio/domain.rb~ +119 -0
- data/lib/lafcadio/domain/DomainObject.rb +375 -0
- data/lib/lafcadio/domain/DomainObject.rb~ +371 -0
- data/lib/lafcadio/domain/MapObject.rb +22 -0
- data/lib/lafcadio/domain/ObjectType.rb +80 -0
- data/lib/lafcadio/includer.rb +18 -0
- data/lib/lafcadio/mock.rb +2 -0
- data/lib/lafcadio/mock/MockDbBridge.rb +78 -0
- data/lib/lafcadio/mock/MockDbBridge.rb~ +74 -0
- data/lib/lafcadio/mock/MockObjectStore.rb +20 -0
- data/lib/lafcadio/objectField.rb +14 -0
- data/lib/lafcadio/objectField/AutoIncrementField.rb +25 -0
- data/lib/lafcadio/objectField/BooleanField.rb +83 -0
- data/lib/lafcadio/objectField/DateField.rb +33 -0
- data/lib/lafcadio/objectField/DateTimeField.rb +25 -0
- data/lib/lafcadio/objectField/DecimalField.rb +41 -0
- data/lib/lafcadio/objectField/EmailField.rb +28 -0
- data/lib/lafcadio/objectField/EnumField.rb +62 -0
- data/lib/lafcadio/objectField/FieldValueError.rb +4 -0
- data/lib/lafcadio/objectField/IntegerField.rb +15 -0
- data/lib/lafcadio/objectField/LinkField.rb +92 -0
- data/lib/lafcadio/objectField/LinkField.rb~ +86 -0
- data/lib/lafcadio/objectField/MoneyField.rb +13 -0
- data/lib/lafcadio/objectField/MonthField.rb +16 -0
- data/lib/lafcadio/objectField/ObjectField.rb +142 -0
- data/lib/lafcadio/objectField/PasswordField.rb +29 -0
- data/lib/lafcadio/objectField/StateField.rb +13 -0
- data/lib/lafcadio/objectField/SubsetLinkField.rb +25 -0
- data/lib/lafcadio/objectField/TextField.rb +23 -0
- data/lib/lafcadio/objectField/TextListField.rb +21 -0
- data/lib/lafcadio/objectField/TimeStampField.rb +15 -0
- data/lib/lafcadio/objectStore.rb +100 -0
- data/lib/lafcadio/objectStore/Cache.rb +81 -0
- data/lib/lafcadio/objectStore/Committer.rb +65 -0
- data/lib/lafcadio/objectStore/CouldntMatchObjectTypeError.rb +4 -0
- data/lib/lafcadio/objectStore/DbBridge.rb +140 -0
- data/lib/lafcadio/objectStore/DbBridge.rb~ +140 -0
- data/lib/lafcadio/objectStore/DomainComparable.rb +25 -0
- data/lib/lafcadio/objectStore/DomainObjectInitError.rb +9 -0
- data/lib/lafcadio/objectStore/DomainObjectNotFoundError.rb +4 -0
- data/lib/lafcadio/objectStore/DomainObjectProxy.rb +62 -0
- data/lib/lafcadio/objectStore/DomainObjectSqlMaker.rb +74 -0
- data/lib/lafcadio/objectStore/ObjectStore.rb +207 -0
- data/lib/lafcadio/objectStore/ObjectStore.rb~ +207 -0
- data/lib/lafcadio/objectStore/SqlValueConverter.rb +30 -0
- data/lib/lafcadio/objectStore/SqlValueConverter.rb~ +30 -0
- data/lib/lafcadio/query.rb +203 -0
- data/lib/lafcadio/query/Compare.rb +55 -0
- data/lib/lafcadio/query/CompoundCondition.rb +39 -0
- data/lib/lafcadio/query/Condition.rb +66 -0
- data/lib/lafcadio/query/Condition.rb~ +66 -0
- data/lib/lafcadio/query/Equals.rb +45 -0
- data/lib/lafcadio/query/In.rb +20 -0
- data/lib/lafcadio/query/Like.rb +48 -0
- data/lib/lafcadio/query/Link.rb +20 -0
- data/lib/lafcadio/query/Max.rb +32 -0
- data/lib/lafcadio/query/Max.rb~ +25 -0
- data/lib/lafcadio/query/Not.rb +21 -0
- data/lib/lafcadio/query/Query.rb +92 -0
- data/lib/lafcadio/schema.rb +2 -0
- data/lib/lafcadio/schema/CreateTableStatement.rb +61 -0
- data/lib/lafcadio/schema/CreateTableStatement.rb~ +59 -0
- data/lib/lafcadio/test.rb +2 -0
- data/lib/lafcadio/test/LafcadioTestCase.rb +17 -0
- data/lib/lafcadio/test/testconfig.dat +13 -0
- data/lib/lafcadio/util.rb +180 -0
- data/lib/lafcadio/util/Context.rb +61 -0
- data/lib/lafcadio/util/ContextualService.rb +33 -0
- data/lib/lafcadio/util/English.rb +117 -0
- data/lib/lafcadio/util/HashOfArrays.rb +48 -0
- data/lib/lafcadio/util/LafcadioConfig.rb +25 -0
- data/lib/lafcadio/util/QueueHash.rb +67 -0
- data/lib/lafcadio/util/UsStates.rb +29 -0
- data/lib/lafcadio/xml.rb +2 -0
- metadata +135 -0
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'lafcadio/objectField/TextField'
|
2
|
+
|
3
|
+
module Lafcadio
|
4
|
+
# EnumField represents an enumerated field that can only be set to one of a
|
5
|
+
# set range of string values. To set the enumeration in the class definition
|
6
|
+
# XML, use the following format:
|
7
|
+
# <field name="flavor" class="EnumField">
|
8
|
+
# <enums>
|
9
|
+
# <enum>Vanilla</enum>
|
10
|
+
# <enum>Chocolate</enum>
|
11
|
+
# <enum>Lychee</enum>
|
12
|
+
# </enums>
|
13
|
+
# </field>
|
14
|
+
# If you're defining the field in Ruby, you can simply pass in an array of
|
15
|
+
# enums as the +enums+ argument.
|
16
|
+
#
|
17
|
+
class EnumField < TextField
|
18
|
+
def EnumField.instantiationParameters( fieldElt ) #:nodoc:
|
19
|
+
parameters = super( fieldElt )
|
20
|
+
if fieldElt.elements['enums'][1].attributes['key']
|
21
|
+
enumValues = []
|
22
|
+
fieldElt.elements.each( 'enums/enum' ) { |enumElt|
|
23
|
+
enumValues << enumElt.attributes['key']
|
24
|
+
enumValues << enumElt.text.to_s
|
25
|
+
}
|
26
|
+
parameters['enums'] = QueueHash.new( *enumValues )
|
27
|
+
else
|
28
|
+
parameters['enums'] = []
|
29
|
+
fieldElt.elements.each( 'enums/enum' ) { |enumElt|
|
30
|
+
parameters['enums'] << enumElt.text.to_s
|
31
|
+
}
|
32
|
+
end
|
33
|
+
parameters
|
34
|
+
end
|
35
|
+
|
36
|
+
def EnumField.instantiateWithParameters( domainClass, parameters ) #:nodoc:
|
37
|
+
self.new( domainClass, parameters['name'], parameters['enums'],
|
38
|
+
parameters['englishName'] )
|
39
|
+
end
|
40
|
+
|
41
|
+
attr_reader :enums
|
42
|
+
|
43
|
+
# [objectType] The domain class that this field belongs to.
|
44
|
+
# [name] The name of this domain class.
|
45
|
+
# [enums] An array of Strings representing the possible choices for
|
46
|
+
# this field.
|
47
|
+
# [englishName] The English name of this field. (Deprecated)
|
48
|
+
def initialize(objectType, name, enums, englishName = nil)
|
49
|
+
require 'lafcadio/util/QueueHash'
|
50
|
+
super objectType, name, englishName
|
51
|
+
if enums.class == Array
|
52
|
+
@enums = QueueHash.newFromArray enums
|
53
|
+
else
|
54
|
+
@enums = enums
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def valueForSQL(value) #:nodoc:
|
59
|
+
value != '' ?(super(value)) : 'null'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'lafcadio/objectField/ObjectField'
|
2
|
+
|
3
|
+
module Lafcadio
|
4
|
+
# IntegerField represents an integer.
|
5
|
+
class IntegerField < ObjectField
|
6
|
+
def textBoxSize #:nodoc:
|
7
|
+
5
|
8
|
+
end
|
9
|
+
|
10
|
+
def valueFromSQL(string) #:nodoc:
|
11
|
+
value = super
|
12
|
+
value ? value.to_i : nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'lafcadio/util'
|
2
|
+
require 'lafcadio/objectField/ObjectField'
|
3
|
+
|
4
|
+
module Lafcadio
|
5
|
+
# A LinkField is used to link from one domain class to another.
|
6
|
+
class LinkField < ObjectField
|
7
|
+
def LinkField.instantiationParameters( fieldElt ) #:nodoc:
|
8
|
+
parameters = super( fieldElt )
|
9
|
+
linkedTypeStr = fieldElt.attributes['linkedType']
|
10
|
+
linkedType = DomainObject.getObjectTypeFromString( linkedTypeStr )
|
11
|
+
parameters['linkedType'] = linkedType
|
12
|
+
parameters['deleteCascade'] = fieldElt.attributes['deleteCascade'] == 'y'
|
13
|
+
parameters
|
14
|
+
end
|
15
|
+
|
16
|
+
def LinkField.instantiateWithParameters( domainClass, parameters ) #:nodoc:
|
17
|
+
instance = self.new(
|
18
|
+
domainClass, parameters['linkedType'], parameters['name'],
|
19
|
+
parameters['englishName'], parameters['deleteCascade']
|
20
|
+
)
|
21
|
+
if parameters['dbFieldName']
|
22
|
+
instance.dbFieldName = parameters['dbFieldName']
|
23
|
+
end
|
24
|
+
instance
|
25
|
+
end
|
26
|
+
|
27
|
+
attr_reader :linkedType
|
28
|
+
attr_accessor :listener, :objectStore, :newDuringEdit, :sortField,
|
29
|
+
:deleteCascade
|
30
|
+
|
31
|
+
# [objectType] The domain class that this field belongs to.
|
32
|
+
# [linkedType] The domain class that this field points to.
|
33
|
+
# [name] The name of this field.
|
34
|
+
# [englishName] The English name of this field. (Deprecated)
|
35
|
+
# [deleteCascade] If this is true, deleting the domain object that is linked
|
36
|
+
# to will cause this domain object to be deleted as well.
|
37
|
+
def initialize( objectType, linkedType, name = nil, englishName = nil,
|
38
|
+
deleteCascade = false )
|
39
|
+
unless name
|
40
|
+
linkedType.name =~ /::/
|
41
|
+
name = $' || linkedType.name
|
42
|
+
name = name.decapitalize
|
43
|
+
end
|
44
|
+
super(objectType, name, englishName)
|
45
|
+
( @linkedType, @deleteCascade ) = linkedType, deleteCascade
|
46
|
+
@listener = nil
|
47
|
+
@newDuringEdit = true
|
48
|
+
end
|
49
|
+
|
50
|
+
def valueForSQL(value) #:nodoc:
|
51
|
+
require 'lafcadio/objectStore/DomainObjectInitError'
|
52
|
+
if !value
|
53
|
+
"null"
|
54
|
+
elsif value.pkId
|
55
|
+
value.pkId
|
56
|
+
else
|
57
|
+
raise( DomainObjectInitError, "Can't commit #{name} without pkId",
|
58
|
+
caller )
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def valueFromSQL(string) #:nodoc:
|
63
|
+
require 'lafcadio/objectStore/DomainObjectProxy'
|
64
|
+
string != nil ? DomainObjectProxy.new(@linkedType, string.to_i) : nil
|
65
|
+
end
|
66
|
+
|
67
|
+
def verify(value, pkId) #:nodoc:
|
68
|
+
super
|
69
|
+
if @linkedType != @objectType && pkId
|
70
|
+
subsetLinkField = nil
|
71
|
+
@linkedType.classFields.each { |field|
|
72
|
+
if field.class == SubsetLinkField && field.subsetField == @name
|
73
|
+
subsetLinkField = field
|
74
|
+
end
|
75
|
+
}
|
76
|
+
if subsetLinkField
|
77
|
+
begin
|
78
|
+
prevObj = ObjectStore.getObjectStore.get(objectType, pkId)
|
79
|
+
prevObjLinkedTo = prevObj.send(name)
|
80
|
+
possiblyMyObj = prevObjLinkedTo.send(subsetLinkField.name)
|
81
|
+
if possiblyMyObj && possiblyMyObj.pkId == pkId
|
82
|
+
cantChangeMsg = "You can't change that."
|
83
|
+
raise FieldValueError, cantChangeMsg, caller
|
84
|
+
end
|
85
|
+
rescue DomainObjectNotFoundError
|
86
|
+
# no previous value, so nothing to check for
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'lafcadio/util'
|
2
|
+
require 'lafcadio/objectField/ObjectField'
|
3
|
+
|
4
|
+
module Lafcadio
|
5
|
+
# A LinkField is used to link from one domain class to another.
|
6
|
+
class LinkField < ObjectField
|
7
|
+
def LinkField.instantiationParameters( fieldElt ) #:nodoc:
|
8
|
+
parameters = super( fieldElt )
|
9
|
+
linkedTypeStr = fieldElt.attributes['linkedType']
|
10
|
+
linkedType = DomainObject.getObjectTypeFromString( linkedTypeStr )
|
11
|
+
parameters['linkedType'] = linkedType
|
12
|
+
parameters['deleteCascade'] = fieldElt.attributes['deleteCascade'] == 'y'
|
13
|
+
parameters
|
14
|
+
end
|
15
|
+
|
16
|
+
def LinkField.instantiateWithParameters( domainClass, parameters ) #:nodoc:
|
17
|
+
self.new( domainClass, parameters['linkedType'], parameters['name'],
|
18
|
+
parameters['englishName'], parameters['deleteCascade'] )
|
19
|
+
end
|
20
|
+
|
21
|
+
attr_reader :linkedType
|
22
|
+
attr_accessor :listener, :objectStore, :newDuringEdit, :sortField,
|
23
|
+
:deleteCascade
|
24
|
+
|
25
|
+
# [objectType] The domain class that this field belongs to.
|
26
|
+
# [linkedType] The domain class that this field points to.
|
27
|
+
# [name] The name of this field.
|
28
|
+
# [englishName] The English name of this field. (Deprecated)
|
29
|
+
# [deleteCascade] If this is true, deleting the domain object that is linked
|
30
|
+
# to will cause this domain object to be deleted as well.
|
31
|
+
def initialize( objectType, linkedType, name = nil, englishName = nil,
|
32
|
+
deleteCascade = false )
|
33
|
+
unless name
|
34
|
+
linkedType.name =~ /::/
|
35
|
+
name = $' || linkedType.name
|
36
|
+
name = name.decapitalize
|
37
|
+
end
|
38
|
+
super(objectType, name, englishName)
|
39
|
+
( @linkedType, @deleteCascade ) = linkedType, deleteCascade
|
40
|
+
@listener = nil
|
41
|
+
@newDuringEdit = true
|
42
|
+
end
|
43
|
+
|
44
|
+
def valueForSQL(value) #:nodoc:
|
45
|
+
require 'lafcadio/objectStore/DomainObjectInitError'
|
46
|
+
if !value
|
47
|
+
"null"
|
48
|
+
elsif value.pkId
|
49
|
+
value.pkId
|
50
|
+
else
|
51
|
+
raise( DomainObjectInitError, "Can't commit #{name} without pkId",
|
52
|
+
caller )
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def valueFromSQL(string) #:nodoc:
|
57
|
+
require 'lafcadio/objectStore/DomainObjectProxy'
|
58
|
+
string != nil ? DomainObjectProxy.new(@linkedType, string.to_i) : nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def verify(value, pkId) #:nodoc:
|
62
|
+
super
|
63
|
+
if @linkedType != @objectType && pkId
|
64
|
+
subsetLinkField = nil
|
65
|
+
@linkedType.classFields.each { |field|
|
66
|
+
if field.class == SubsetLinkField && field.subsetField == @name
|
67
|
+
subsetLinkField = field
|
68
|
+
end
|
69
|
+
}
|
70
|
+
if subsetLinkField
|
71
|
+
begin
|
72
|
+
prevObj = ObjectStore.getObjectStore.get(objectType, pkId)
|
73
|
+
prevObjLinkedTo = prevObj.send(name)
|
74
|
+
possiblyMyObj = prevObjLinkedTo.send(subsetLinkField.name)
|
75
|
+
if possiblyMyObj && possiblyMyObj.pkId == pkId
|
76
|
+
cantChangeMsg = "You can't change that."
|
77
|
+
raise FieldValueError, cantChangeMsg, caller
|
78
|
+
end
|
79
|
+
rescue DomainObjectNotFoundError
|
80
|
+
# no previous value, so nothing to check for
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'lafcadio/objectField/DecimalField'
|
2
|
+
|
3
|
+
module Lafcadio
|
4
|
+
class MoneyField < DecimalField #:nodoc:
|
5
|
+
def MoneyField.instantiateWithParameters( domainClass, parameters )
|
6
|
+
self.new( domainClass, parameters['name'], parameters['englishName'] )
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(objectType, name, englishName = nil)
|
10
|
+
super(objectType, name, 2, englishName)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'lafcadio/objectField/DateField'
|
2
|
+
require 'lafcadio/dateTime/Month'
|
3
|
+
|
4
|
+
module Lafcadio
|
5
|
+
# Accepts a Month as a value. This field automatically saves in MySQL as a
|
6
|
+
# date corresponding to the first day of the month.
|
7
|
+
class MonthField < DateField
|
8
|
+
def MonthField.valueType #:nodoc:
|
9
|
+
Month
|
10
|
+
end
|
11
|
+
|
12
|
+
def valueForSQL(value) #:nodoc:
|
13
|
+
"'#{value.year}-#{value.month}-01'"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'lafcadio/util/English'
|
2
|
+
require 'lafcadio/objectField/FieldValueError'
|
3
|
+
|
4
|
+
module Lafcadio
|
5
|
+
# ObjectField is the abstract base class of any field for domain objects.
|
6
|
+
class ObjectField
|
7
|
+
include Comparable
|
8
|
+
|
9
|
+
attr_reader :name, :defaultFieldName, :objectType
|
10
|
+
attr_accessor :notNull, :hideLabel, :writeOnce, :unique, :hideDisplay,
|
11
|
+
:default, :dbFieldName, :notUniqueMsg
|
12
|
+
|
13
|
+
def ObjectField.valueType #:nodoc:
|
14
|
+
Object
|
15
|
+
end
|
16
|
+
|
17
|
+
def ObjectField.instantiationParameters( fieldElt ) #:nodoc:
|
18
|
+
parameters = {}
|
19
|
+
parameters['name'] = fieldElt.attributes['name']
|
20
|
+
parameters['englishName'] = fieldElt.attributes['englishName']
|
21
|
+
parameters['dbFieldName'] = fieldElt.attributes['dbFieldName']
|
22
|
+
parameters
|
23
|
+
end
|
24
|
+
|
25
|
+
def ObjectField.instantiateFromXml( domainClass, fieldElt ) #:nodoc:
|
26
|
+
parameters = instantiationParameters( fieldElt )
|
27
|
+
instantiateWithParameters( domainClass, parameters )
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.instantiateWithParameters( domainClass, parameters ) #:nodoc:
|
31
|
+
instance = self.new( domainClass, parameters['name'],
|
32
|
+
parameters['englishName'] )
|
33
|
+
if ( dbFieldName = parameters['dbFieldName'] )
|
34
|
+
instance.dbFieldName = dbFieldName
|
35
|
+
end
|
36
|
+
instance
|
37
|
+
end
|
38
|
+
|
39
|
+
# [objectType] The domain class that this object field belongs to.
|
40
|
+
# [name] The name of this field.
|
41
|
+
# [englishName] The descriptive English name of this field. (Deprecated)
|
42
|
+
def initialize(objectType, name, englishName = nil )
|
43
|
+
@objectType = objectType
|
44
|
+
@name = name
|
45
|
+
@dbFieldName = name
|
46
|
+
@notNull = true
|
47
|
+
@unique = false
|
48
|
+
( @default, @notUniqueMsg ) = [ nil, nil ]
|
49
|
+
@englishNameOrNil = englishName
|
50
|
+
end
|
51
|
+
|
52
|
+
def bind_write?; false; end #:nodoc:
|
53
|
+
|
54
|
+
def db_table_and_field_name
|
55
|
+
"#{ objectType.tableName }.#{ dbFieldName }"
|
56
|
+
end
|
57
|
+
|
58
|
+
def englishName #:nodoc:
|
59
|
+
@englishNameOrNil || English.camelCaseToEnglish(name).capitalize
|
60
|
+
end
|
61
|
+
|
62
|
+
def nullErrorMsg #:nodoc:
|
63
|
+
English.sentence "Please enter %a %nam.", englishName.downcase
|
64
|
+
end
|
65
|
+
|
66
|
+
def verify(value, pkId) #:nodoc:
|
67
|
+
if value.nil? && notNull
|
68
|
+
raise FieldValueError, nullErrorMsg, caller
|
69
|
+
end
|
70
|
+
if value
|
71
|
+
valueType = self.class.valueType
|
72
|
+
unless value.class <= valueType
|
73
|
+
raise FieldValueError,
|
74
|
+
"#{name} needs an object of type #{valueType.name}", caller
|
75
|
+
end
|
76
|
+
verifyUniqueness(value, pkId) if unique
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def verifyUniqueness(value, pkId) #:nodoc:
|
81
|
+
inferrer = Query::Inferrer.new( @objectType ) { |domain_obj|
|
82
|
+
Query.And( domain_obj.send( self.name ).equals( value ),
|
83
|
+
domain_obj.pkId.equals( pkId ).not )
|
84
|
+
}
|
85
|
+
collisions = ObjectStore.getObjectStore.getSubset( inferrer.execute )
|
86
|
+
if collisions.size > 0
|
87
|
+
if @notUniqueMsg
|
88
|
+
notUniqueMsg = @notUniqueMsg
|
89
|
+
else
|
90
|
+
notUniqueMsg = "That #{englishName.downcase} is already taken. " +
|
91
|
+
"Please choose another."
|
92
|
+
end
|
93
|
+
raise FieldValueError, notUniqueMsg, caller
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# Returns the name that this field is referenced by in the MySQL table. By
|
98
|
+
# default this is the same as the name; to override it, set
|
99
|
+
# ObjectField#dbFieldName.
|
100
|
+
def nameForSQL
|
101
|
+
dbFieldName
|
102
|
+
end
|
103
|
+
|
104
|
+
# Returns a string value suitable for committing this field's value to
|
105
|
+
# MySQL.
|
106
|
+
def valueForSQL(value)
|
107
|
+
value || 'null'
|
108
|
+
end
|
109
|
+
|
110
|
+
def firstTime(fieldManager) #:nodoc:
|
111
|
+
pkId = fieldManager.getpkId
|
112
|
+
pkId == nil
|
113
|
+
end
|
114
|
+
|
115
|
+
def prevValue(pkId) #:nodoc:
|
116
|
+
prevObject = ObjectStore.getObjectStore.get(@objectType, pkId)
|
117
|
+
prevObject.send(name)
|
118
|
+
end
|
119
|
+
|
120
|
+
def processBeforeVerify(value) #:nodoc:
|
121
|
+
value = @default if value == nil
|
122
|
+
value
|
123
|
+
end
|
124
|
+
|
125
|
+
# Given the SQL value string, returns a Ruby-native value.
|
126
|
+
def valueFromSQL(string)
|
127
|
+
string
|
128
|
+
end
|
129
|
+
|
130
|
+
def <=>(other)
|
131
|
+
if @objectType == other.objectType && name == other.name
|
132
|
+
0
|
133
|
+
else
|
134
|
+
object_id <=> other.object_id
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def dbWillAutomaticallyWrite #:nodoc:
|
139
|
+
false
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'lafcadio/objectField/TextField'
|
2
|
+
|
3
|
+
module Lafcadio
|
4
|
+
# A PasswordField is simply a TextField that is expected to contain a password
|
5
|
+
# value. It can be set to auto-generate a password at random.
|
6
|
+
class PasswordField < TextField
|
7
|
+
# Returns a random 8-letter alphanumeric password.
|
8
|
+
def PasswordField.randomPassword
|
9
|
+
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".
|
10
|
+
split(//)
|
11
|
+
value = ""
|
12
|
+
0.upto(8) { |i| value += chars[rand(chars.size)] }
|
13
|
+
value
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_reader :maxLength
|
17
|
+
attr_accessor :autoGenerate
|
18
|
+
|
19
|
+
# [objectType] The domain class that this object field belongs to.
|
20
|
+
# [name] The name of this field.
|
21
|
+
# [maxLength] The maximum length of the password. (Deprecated)
|
22
|
+
# [englishName] The descriptive English name of this field. (Deprecated)
|
23
|
+
def initialize(objectType, maxLength, name = "password", englishName = nil)
|
24
|
+
super(objectType, name, englishName)
|
25
|
+
@maxLength = maxLength
|
26
|
+
@autoGenerate = true
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|